Oracle转SQL Server:多列UNPIVOT语句改写求助
在SQL Server中实现Oracle多列UNPIVOT的等价方案
Oracle支持一次性对多列组执行UNPIVOT,但SQL Server原生不支持这种语法,你可以通过以下两种方式实现等价功能:
方法1:使用CROSS APPLY + VALUES(推荐,性能更优)
这种方式只扫描一次原表,性能比UNION ALL更好:
SELECT unpvt.col, unpvt.value, unpvt.prev_value FROM your_table -- 替换成你的实际表名 CROSS APPLY ( VALUES ('title', title, prev_title), ('stage', stage, prev_stage), ('value', value, prev_value) ) AS unpvt(col, value, prev_value);
方法2:使用UNION ALL拼接结果
如果你的SQL Server版本较低(不支持CROSS APPLY),可以用UNION ALL逐个列组转换:
SELECT 'title' AS col, title AS value, prev_title AS prev_value FROM your_table UNION ALL SELECT 'stage' AS col, stage AS value, prev_stage AS prev_value FROM your_table UNION ALL SELECT 'value' AS col, value AS value, prev_value AS prev_value FROM your_table;
两种方法都能得到和Oracle UNPIVOT语句完全一致的结果:将原表中(title, prev_title)、(stage, prev_stage)、(value, prev_value)这三组列,分别转换为col字段对应值,同时保留每组的两个值到value和prev_value列中。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

