【问题标题】:Oracle - split single row into multiple rowsOracle - 将单行拆分为多行
【发布时间】: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?

【问题讨论】:

    标签: sql oracle


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 2021-02-17
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多