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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:11:54