Oracle 11 SQL:有没有办法将 1 行拆分为 x 行

Posted

技术标签:

【中文标题】Oracle 11 SQL:有没有办法将 1 行拆分为 x 行【英文标题】:Oracle 11 SQL : Is there a way to split 1 row into x rows 【发布时间】:2019-12-06 16:38:01 【问题描述】:

客户要求将 Oracle DB SQL 中的 1 行拆分为 6 行。

假设,最初的 SQL(具有多个连接的复杂 sql 等)正在拉入 9 列: 从 X、Y、Z 中选择 A、B、C、D、E、F、G、H、I。 . . (但相当复杂的查询)

1) A、B、C、D、E、F、G、H、I。

现在,客户要求返回上述模式的每一行,新的输出应该如下所示: 1) A、B、C、'D'、D 2) A、B、C、'E'、E 3) A、B、C、'F'、F 4) A、B、C、'G'、G 5) A、B、C、'H'、H 6)A,B,C,'我',我

基本上,前 3 列将在所有 6 个 NEW ROWS 中重复。 对原始查询中的每一行重复该过程。

这可能吗?如果是,如何?

【问题讨论】:

是 A、B、C、D、E、F、G、H 列名还是实际值 它们是从各个表中提取的值 有点不清楚,能否提供列名和值 这是可能的,使用unpivot 运算符(最有效的方法;还有其他方法)。如果您显示的是复杂查询的结果,那没关系;将其全部视为子查询(可能在with 子句中)。但是,更大的问题是,如果带有连接和诸如此类的“大查询”以不是所需格式的格式给出结果,那么为什么首先要以这种方式编写大查询?可能有更有效的方法可以直接获得所需的结果,而不是通过取消旋转您目前的结果。 @mathguy : 最初的请求是带有连接等的大查询。然后,在我们交付项目后,客户要求 chagne --- 不知道客户为什么要求更改。你能请。请用 unpivot 操作员回答?谢谢。 【参考方案1】:

使用union all 可能最简单:

select a, b, c, 'D' as which, d as val from t union all
select a, b, c, 'E', e from t union all
select a, b, c, 'F', f from t union all
select a, b, c, 'G', g from t union all
select a, b, c, 'H', j from t union all
select a, b, c, 'I', i from t ;

这是最简单的方法,但不是最有效的。它将为每一列扫描一次表。对于不太大的表,从性能角度来看,这可能很好(表缓存在内存中)。

如果“表”确实是一个视图,那么性能可能是一个更重要的问题。

【讨论】:

谢谢。这是最简单明了的。由于此查询返回大约 50 万行,因此最好采用更有效的方法。无论如何,谢谢。 @anjanb 。 . .实际上,就这么多数据而言,它可能没有什么不同。该表将在第一次扫描后加载到内存中,随后的扫描将非常快。 数据库中有多个这样的查询同时进行。我怀疑数据库只会将此查询的结果加载到 RAM 中,因为其他查询的结果集更大。无论如何我都会测试它并分享我的结果。【参考方案2】:

你只需要unpivot 子句来垂直显示数据:

with t(a,b,c,d,e,f,g,h,i) as
(
 select 1,2,3,'D','E',2,3,'X','Y' from dual 
)
select a,b,c,val from
(
select a,b,c,to_char(d) as d, to_char(e) as e, to_char(f) as f, to_char(g) as g, 
             to_char(h) as h, to_char(i) as i
  from t
)  
unpivot 
( val for col in (d,e,f,g,h,i) )
order by col

Demo

to_char() 转换是针对 ORA-01790: expression must have the same datatype as对应的表达式错误实现的。

【讨论】:

嗨@Barbaros,谢谢。 A、B、C、D、E、F、G、H、I 不是字符串/字符。其中一些是字符串,其中一些是数字等。你能修改你的 SQL 吗? 嗯嗯,那么你需要考虑 unpivot 子句。不客气@anjanb 嗨@Barbaros Özhan,谢谢。你回答了我的问题。我有另一个非常相关的问题——请回答:***.com/questions/59244741/…

以上是关于Oracle 11 SQL:有没有办法将 1 行拆分为 x 行的主要内容,如果未能解决你的问题,请参考以下文章

转:PL/SQL在 win8.1系统下连接Oracle11g没有database处理方法

有没有办法将“%”符号添加到我在 Oracle SQL 中的透视结果中并将它们转换为 to_char

win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法

使用 Oracle SQL 将可变长度分隔字符串拆分为列

有没有办法将数据从 Oracle 表填充到 Active Directory?

[Oracle] “表中有数据,但select count(*)的结果为0”问题的解决办法