Oracle - 将单行拆分为多行

时间:2014-09-17 11:02:35

标签: sql oracle

在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?

2 个答案:

答案 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