You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码细节解释

  1. UNION ALL:用来把两个查询的结果纵向合并,它不会自动去重(如果同一个物品出现多次会保留,完全符合你要展示所有所有物的需求),而且比UNION效率更高。
  2. 统一字段名:内层查询把Table1的item和Table2的Cars都重命名为Belongings,这样外层可以输出结构统一的结果列。
  3. 生成连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:31:11