【问题标题】:Oracle 11 SQL : Is there a way to split 1 row into x rowsOracle 11 SQL:有没有办法将 1 行拆分为 x 行
【发布时间】: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 操作员回答?谢谢。

标签: sql oracle 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,谢谢。你回答了我的问题。我有另一个非常相关的问题——请回答:stackoverflow.com/questions/59244741/…
猜你喜欢
  • 2019-11-09
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2014-12-12
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多