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

如何通过ID匹配三个含不同记录的SQL表并生成混合结果表?

合并同ID多表数据的SQL实现

方法1:使用FULL OUTER JOIN(支持数据库:PostgreSQL、SQL Server等)

如果你的数据库支持FULL OUTER JOIN,这是最直接的实现方式,能保留所有表中的ID,将对应数据合并到同一行。

假设三张表结构如下:

  • table_a:存储ID和A类数据,字段为id、data_a
  • table_b:存储ID和B类数据,字段为id、data_b
  • table_c:存储ID和C类数据,字段为id、data_c

对应的SQL语句:

SELECT
    COALESCE(a.id, b.id, c.id) AS id,
    a.data_a,
    b.data_b,
    c.data_c
FROM table_a a
FULL OUTER JOIN table_b b ON a.id = b.id
FULL OUTER JOIN table_c c ON COALESCE(a.id, b.id) = c.id;
  • COALESCE函数从三个表的ID中取第一个非空值,确保结果每行都有唯一ID
  • FULL OUTER JOIN会包含所有表中出现过的ID,即使某个ID只在其中一个或两个表中存在,缺失的数据列会显示NULL

方法2:兼容无FULL OUTER JOIN的数据库(比如MySQL)

如果你的数据库不支持FULL OUTER JOIN,可以先通过UNION ALL收集所有表的ID,再用LEFT JOIN关联三张表:

SELECT
    all_ids.id,
    a.data_a,
    b.data_b,
    c.data_c
FROM (
    -- 收集所有出现过的ID,UNION ALL保留重复,后续GROUP BY去重
    SELECT id FROM table_a
    UNION ALL
    SELECT id FROM table_b
    UNION ALL
    SELECT id FROM table_c
) AS all_ids
LEFT JOIN table_a a ON all_ids.id = a.id
LEFT JOIN table_b b ON all_ids.id = b.id
LEFT JOIN table_c c ON all_ids.id = c.id
GROUP BY all_ids.id, a.data_a, b.data_b, c.data_c;
  • 子查询all_ids获取所有表中存在的ID,GROUP BY确保每个ID只出现一次
  • LEFT JOIN保证每个ID都能关联到对应表的数据,缺失列显示NULL

处理单表存在重复ID的情况

如果某个表中同一ID对应多条数据,需要先对单表做聚合处理,避免结果出现重复行:

SELECT
    COALESCE(a.id, b.id, c.id) AS id,
    a.data_a,
    b.data_b,
    c.data_c
FROM (
    -- 对table_a按ID聚合,取最大值(或MIN/GROUP_CONCAT,根据需求选择)
    SELECT id, MAX(data_a) AS data_a FROM table_a GROUP BY id
) a
FULL OUTER JOIN (
    SELECT id, MAX(data_b) AS data_b FROM table_b GROUP BY id
) b ON a.id = b.id
FULL OUTER JOIN (
    SELECT id, MAX(data_c) AS data_c FROM table_c GROUP BY id
) c ON COALESCE(a.id, b.id) = c.id;
  • 这里用MAX聚合单表的重复ID数据,你可以根据实际需求替换成MIN(取最小值)、GROUP_CONCAT(拼接所有值)等函数

内容的提问来源于stack exchange,提问作者julian.wurzer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:30:58