SQL查询需求:将两张用户关联表分行合并而非同列合并
解决方法:用UNION ALL纵向拼接结果集
嘿,看你的需求就明白,你要的不是表的横向关联(JOIN),而是把两个表中同一用户的物品纵向拆分成单独行展示——这时候JOIN完全不适用,你需要用UNION ALL来实现。
核心思路
分别从两个表中提取用户和对应的物品,把不同字段名统一成同一个(比如Belongings),然后把两个结果集拼在一起,最后按需生成ID和排序即可。
针对你的示例的SQL查询
假设你的表名分别是Table1和Table2,要查询Peter的所有物品,可以用下面的语句:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID, "User", Belongings FROM ( -- 从表1提取Peter的物品 SELECT "User", item AS Belongings FROM Table1 WHERE "User" = 'Peter' UNION ALL -- 从表2提取Peter的车辆 SELECT "User", Cars AS Belongings FROM Table2 WHERE "User" = 'Peter' ) AS Combined ORDER BY ID;
代码细节解释
UNION ALL:用来把两个查询的结果纵向合并,它不会自动去重(如果同一个物品出现多次会保留,完全符合你要展示所有所有物的需求),而且比UNION效率更高。- 统一字段名:内层查询把
Table1的item和Table2的Cars都重命名为Belongings,这样外层可以输出结构统一的结果列。 - 生成连续ID:
ROW_NUMBER()函数用来生成你示例里的连续ID,ORDER BY (SELECT NULL)表示按数据库默认顺序排序;如果你想指定排序规则(比如先显示车辆还是水果),可以改成具体条件,比如ORDER BY Belongings或者给来源表加标识来排序。
调整排序顺序(可选)
如果你想让结果和你的示例顺序完全一致(先车辆后水果),可以给每个来源表加一个标识,然后按这个标识排序:
SELECT ROW_NUMBER() OVER (ORDER BY SourceTable DESC, Belongings) AS ID, "User", Belongings FROM ( SELECT "User", item AS Belongings, 'Table1' AS SourceTable FROM Table1 WHERE "User" = 'Peter' UNION ALL SELECT "User", Cars AS Belongings, 'Table2' AS SourceTable FROM Table2 WHERE "User" = 'Peter' ) AS Combined ORDER BY ID;
查询所有用户的所有物
如果不需要只查Peter,去掉WHERE "User" = 'Peter'条件即可。
内容的提问来源于stack exchange,提问作者Snoopy
相关产品推荐
相关产品推荐

