Oracle - 将单行拆分为多行
Posted
技术标签:
【中文标题】Oracle - 将单行拆分为多行【英文标题】:Oracle - split single row into multiple rows 【发布时间】:2014-09-17 11:02:35 【问题描述】:在 Oracle 数据库中,我有一个表,其中包含许多不同测试类型的结果。
表:
object_tested, test_date, test_a, test_a_result, test_b, test_b_result
TmpObj timestamp, value1 value2 value3 value4
我需要导出这些测试结果,但为每个测试创建一个单独的行,例如:
object_tested, test_date, test, test_result
TmpObj timestamp, value1, value2
TmpObj timestamp, value3, value4
最快的方法是什么?也许是 UNION 或 JOIN?
【问题讨论】:
【参考方案1】:最简单的方法是使用union all
:
select object_tested, test_date, test_a as test, test_a_result as test_result
from table t
union all
select object_tested, test_date, test_b as test, test_b_result as test_result
from table t;
如果你想要输出中的测试类型:
select object_tested, test_date, 'a' as test_type, test_a as test, test_a_result as test_result
from table t
union all
select object_tested, test_date, 'b' as test_type, test_b as test, test_b_result as test_result
from table t;
Oracle 11 还支持 unpivot
运算符,它执行类似的操作。如果你有一个非常大的表并且关心性能,unpivot
或使用join
的方法可以工作。
【讨论】:
感谢您,UNION ALL(如果他们希望我删除重复项,可以使用 UNION)似乎是构建此查询的最简单方法。【参考方案2】:在 Oracle 数据库中,pivot 和 unpivot 运算符使您能够将一行分成许多列,或将列收集到更少的行中。
WITH t(object_tested, test_date,
test_a, test_a_result, test_b, test_b_result) AS
(SELECT 'TmpObj' ,
'timestamp',
'value1' ,
'value2' ,
'value3' ,
'value4'
FROM dual
)
SELECT *
FROM t unpivot ((test_result,test)
FOR category IN (
(test_a_result,test_a) AS 'a' ,
(test_b_result,test_b) AS 'b'
)
)
Pivot 和 unpivot 运算符 oracle 演示:
http://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php
【讨论】:
以上是关于Oracle - 将单行拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章