SQL执行Full Outer Join无法获取全部行的问题求助
问题分析与解决
问题原因
你得到的结果中,表2独有的Extra Active 28 pc 54g记录的Category和Date显示为Null,是因为查询时直接引用了单一表(比如表1)的Category和Date字段。当这条记录仅存在于表2时,表1对应的字段值为Null,导致结果中这两个字段显示为空。
解决方案
使用COALESCE函数获取两个表中Category和Date的非空值,确保无论记录来自哪张表,都能显示正确的分类和日期。同时根据数据库类型编写正确的Full Outer Join语句:
1. 支持FULL OUTER JOIN的数据库(如SQL Server、PostgreSQL)
SELECT COALESCE(t1.Category, t2.Category) AS Category, COALESCE(t1.Date, t2.Date) AS Date, t1.Sales_1, t2.Sales_2 FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.Category = t2.Category AND t1.Date = t2.Date;
2. 不支持FULL OUTER JOIN的数据库(如MySQL)
通过LEFT JOIN + RIGHT JOIN + UNION ALL模拟实现:
SELECT COALESCE(t1.Category, t2.Category) AS Category, COALESCE(t1.Date, t2.Date) AS Date, t1.Sales_1, t2.Sales_2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.Category = t2.Category AND t1.Date = t2.Date UNION ALL SELECT COALESCE(t1.Category, t2.Category) AS Category, COALESCE(t1.Date, t2.Date) AS Date, t1.Sales_1, t2.Sales_2 FROM table1 t1 RIGHT JOIN table2 t2 ON t1.Category = t2.Category AND t1.Date = t2.Date WHERE t1.Category IS NULL;
说明
COALESCE(a, b)会返回第一个非空参数值:记录来自表2时取t2的Category和Date,来自表1时取t1的,匹配的记录则取任意一个(值相同)。- 同时用
Date辅助关联,可避免同一分类不同日期的记录错误匹配(适用于存在多日期数据的业务场景)。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

