如何在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
相关产品推荐
相关产品推荐

