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 - 将单行拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章

oracle单行多列,拆分成多行

Impala:根据日期和时间将单行拆分为多行

Hadoop/Hive - 将单行拆分为多行

将行拆分为多行 Oracle

SQL中如何将单行数据拆分成多行?

使用Python将单行的文本拆分为CSV文件中同一列的多行