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

SQL使用FULL OUTER JOIN连接两表关联键缺失如何返回正确结果

解决方案

你不需要调整JOIN类型,FULL OUTER JOIN本身就是适配这个场景的正确选择,之前返回错误结果的核心原因是SELECT子句中季度字段的取值逻辑有问题。

FULL OUTER JOIN会同时保留左表独有、右表独有、两表匹配的三类行:当某行是右表(table2)独有的记录时(也就是案例中Q3的行,table1无对应匹配项),直接取table1.Quarter必然返回NULL。只要用COALESCE函数提取两表中非空的季度值作为最终展示的季度字段即可,不需要额外复杂逻辑。

标准SQL写法(支持FULL OUTER JOIN的数据库:PostgreSQL、SQL Server、Oracle等)

SELECT
  COALESCE(t1.Quarter, t2.Quarter) AS Quarter,
  t1.Sales,
  t2.Cost
FROM table1 t1
FULL OUTER JOIN table2 t2
  ON t1.Quarter = t2.Quarter
ORDER BY Quarter;

COALESCE函数会按顺序返回参数列表中第一个非NULL的值,这里会优先取左表的季度值,左表无匹配时自动取右表的季度值,正好覆盖所有季度的展示需求。

兼容写法(不支持FULL OUTER JOIN的数据库:MySQL等)

可以用LEFT JOIN + UNION的组合实现完全等价的效果:

SELECT
  t1.Quarter,
  t1.Sales,
  t2.Cost
FROM table1 t1
LEFT JOIN table2 t2 ON t1.Quarter = t2.Quarter
UNION
SELECT
  t2.Quarter,
  NULL AS Sales,
  t2.Cost
FROM table2 t2
LEFT JOIN table1 t1 ON t1.Quarter = t2.Quarter
WHERE t1.Quarter IS NULL
ORDER BY Quarter;

返回结果验证

执行上述语句后会返回完全符合预期的结果:

  • Q1:Sales=100,Cost=20
  • Q2:Sales=200,Cost=50
  • Q3:Sales=NULL,Cost=70
  • Q4:Sales=300,Cost=10

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:48:19