SQL关联含空值两表:如何实现指定格式的结果合并?
正确实现需求的SQL方案
嘿,我完全get到你的需求了——你不是要把两张表中匹配的Name记录做关联拼接,而是想把表1的所有记录(带着Date,Colour设为NULL)和表2的所有记录(带着Colour,Date设为NULL)合并成一个结果集,对吧?
为什么LEFT JOIN不符合你的需求
你之前用LEFT JOIN得到交叉关联结果(比如John 12th Red),是因为LEFT JOIN的核心逻辑是基于Name做匹配关联:只要两张表中有相同的Name,就会把对应的Date和Colour都拼到同一条记录里,这和你要的“表1记录只带Date、表2记录只带Colour,另一字段为NULL”的目标完全不符。
正确的SQL实现:用UNION ALL拼接结果集
要实现你的需求,应该用UNION ALL把两个独立的查询结果上下拼接起来,而不是做横向关联:
-- 取出表1的所有记录,Colour字段设为NULL SELECT Name, Date, NULL AS Colour FROM 表1 -- 拼接表2的所有记录,Date字段设为NULL UNION ALL SELECT Name, NULL AS Date, Colour FROM 表2;
代码说明
- 第一个查询从表1获取所有
Name和Date,手动将Colour字段赋值为NULL; - 第二个查询从表2获取所有
Name和Colour,手动将Date字段赋值为NULL; UNION ALL会直接把这两个结果集拼接在一起,不会对重复的Name去重:如果某个Name只在一张表中存在,就保留一条对应记录;如果在两张表都存在,会保留两条记录(一条来自表1带Date,一条来自表2带Colour),完全贴合你的需求。
如果你特殊场景下不希望同一Name出现两条记录(但你的需求明确要各自对应NULL,所以大概率不需要),可以把UNION ALL换成UNION,但这会自动去重丢失其中一条记录,不符合原始需求,所以不推荐。
内容的提问来源于stack exchange,提问作者James B
相关产品推荐
相关产品推荐

