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

如何在SQL中合并列不同的两张表并保留全部记录?

解决方案:用FULL OUTER JOIN合并双表所有记录与列

你需要保留两张表的所有行和所有列,同时合并Date、Name这类共同列,这种场景下FULL OUTER JOIN是最直接的解决方案。

基础实现(支持FULL OUTER JOIN的数据库:SQL Server、PostgreSQL、Oracle等)

SELECT
    COALESCE(t1.Date, t2.Date) AS Date,
    COALESCE(t1.Name, t2.Name) AS Name,
    t1.Parts,
    t1.Contact,
    t2.Location,
    t2.Vehicle
FROM Table1 t1
FULL OUTER JOIN Table2 t2
    ON t1.Date = t2.Date 
    AND t1.Name = t2.Name;

关键说明:

  • FULL OUTER JOIN:会包含两张表的所有记录,无论Date和Name是否匹配。匹配到的行合并所有列,未匹配的行对应缺失列自动填充为NULL(即你要求的留空)。
  • COALESCE:用来统一共同列的取值逻辑——优先取Table1的Date/Name,若Table1无对应行则取Table2的,避免出现重复的Date或Name列。

兼容MySQL的模拟实现(MySQL不支持FULL OUTER JOIN)

如果用的是MySQL,可以通过LEFT JOIN + RIGHT JOIN + UNION ALL来模拟相同效果:

-- 先取Table1所有行 + 匹配的Table2数据
SELECT
    t1.Date,
    t1.Name,
    t1.Parts,
    t1.Contact,
    t2.Location,
    t2.Vehicle
FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.Date = t2.Date 
    AND t1.Name = t2.Name

UNION ALL

-- 再取Table2中未与Table1匹配的行
SELECT
    t2.Date,
    t2.Name,
    t1.Parts,
    t1.Contact,
    t2.Location,
    t2.Vehicle
FROM Table1 t1
RIGHT JOIN Table2 t2
    ON t1.Date = t2.Date 
    AND t1.Name = t2.Name
WHERE t1.Date IS NULL;

关键说明:

  • UNION ALL用来合并两个查询结果,WHERE t1.Date IS NULL确保只取Table2中没有和Table1匹配的行,避免重复数据。

内容的提问来源于stack exchange,提问作者SQL Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:22:39