在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?
答案 0 :(得分:4)
最简单的方法是使用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
的方法可以正常工作。
答案 1 :(得分: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 demo:
http://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php