Oracle中将UNION ALL列转行查询替换为UNPIVOT的实现方法
结论
完全可以使用Oracle的UNPIVOT语句替换原有UNION ALL实现的列转行逻辑,最终输出结果和原有逻辑100%一致。
实现代码
SELECT COL1, COL2, SEQ, 'GRP 10' AS GRP_NAME, INPUT_COL_NAME, OUTPUT_COL_NAME FROM TABLE1 -- 加INCLUDE NULLS完全对齐UNION ALL逻辑,NULL值也会保留对应行,不需要可移除 UNPIVOT INCLUDE NULLS ( COL2 FOR (INPUT_COL_NAME, SEQ, OUTPUT_COL_NAME) IN ( ABC AS ('ABC', '1', 'NEW1'), MNO AS ('MNO', '2', 'NEW2'), XYZ AS ('XYZ', '3', 'NEW3') ) )
结果验证
结合你给出的测试数据,上述UNPIVOT查询和原有UNION ALL查询输出完全一致,结果如下:
| COL1 | COL2 | SEQ | GRP_NAME | INPUT_COL_NAME | OUTPUT_COL_NAME |
|---|---|---|---|---|---|
| 1 | 0 | 1 | GRP 10 | ABC | NEW1 |
| 1 | 20 | 2 | GRP 10 | MNO | NEW2 |
| 1 | 100 | 3 | GRP 10 | XYZ | NEW3 |
| 2 | 15 | 1 | GRP 10 | ABC | NEW1 |
| 2 | 50 | 2 | GRP 10 | MNO | NEW2 |
| 2 | 150 | 3 | GRP 10 | XYZ | NEW3 |
方案优势
- 性能更优:原有UNION ALL写法需要扫描TABLE1三次,UNPIVOT写法仅需扫描一次,数据量越大性能提升越明显
- 维护更简单:后续需要新增转换列时,只需在UNPIVOT的IN子句中新增对应映射规则即可,无需重复写SELECT逻辑
内容的提问来源于stack exchange,提问作者OracleForLife
相关产品推荐
相关产品推荐

