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

