SQL Server合并两表列值到新表并按ID分组排序的问题
解决同一ID记录连续排列的SQL调整方案
嘿,我懂你的需求啦!现在直接用UNION ALL合并插入的话,数据库不会自动帮你按ID分组排列,所以同一ID的记录会被打乱。要实现同一ID的记录连续排列,咱们只需要在合并数据的时候加上排序逻辑就行,下面给你两种可行的方案:
基础方案:按ID排序插入
直接在合并后的数据集上按ID排序,再插入到Table3中:
INSERT INTO Table3 (ID, Name, EarningOrDeduction) SELECT ID, Name, EarningOrDeduction FROM ( -- 先把两个表的数据统一字段名合并 SELECT ID, Name, Earning AS EarningOrDeduction FROM Table1 UNION ALL SELECT ID, Name, Deduction AS EarningOrDeduction FROM Table2 ) AS CombinedData ORDER BY ID;
这个方案会让所有相同ID的记录连续排列,不管是来自Table1还是Table2的。
进阶方案:按ID+类型排序
如果还想让同一ID下,先显示所有薪资项(Earning)再显示扣除项(Deduction),或者反过来,可以新增一个排序标记字段:
INSERT INTO Table3 (ID, Name, EarningOrDeduction) SELECT ID, Name, EarningOrDeduction FROM ( SELECT ID, Name, Earning AS EarningOrDeduction, 1 AS SortPriority FROM Table1 -- 标记薪资项为高优先级,先显示 UNION ALL SELECT ID, Name, Deduction AS EarningOrDeduction, 2 AS SortPriority FROM Table2 -- 扣除项后显示 ) AS CombinedData ORDER BY ID, SortPriority;
要是想让扣除项先显示,只需要把Table1的SortPriority改成2,Table2的改成1就行。
兼容性说明
有些数据库(比如MySQL)支持直接在UNION ALL后面加ORDER BY,不需要子查询,写法更简洁:
INSERT INTO Table3 (ID, Name, EarningOrDeduction) SELECT ID, Name, Earning FROM Table1 UNION ALL SELECT ID, Name, Deduction FROM Table2 ORDER BY ID;
不过用子查询的写法兼容性更强,几乎所有主流数据库都支持。
内容的提问来源于stack exchange,提问作者Rahul Thakur
相关产品推荐
相关产品推荐

