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

Oracle 11 SQL : Is there a way to split 1 row into x rows

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

比方说,最初 SQL(具有多个连接的复杂 sql 等)正在拉入 9 列:
select 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, 'I', 我

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

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

使用 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 ;

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

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

您只需要 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 same数据类型为对应的表达式错误。