使用left join时添加右表where条件无法获取左表数据问题咨询
问题结论
在LEFT JOIN后对右表字段添加WHERE过滤条件,确实会导致原本应该保留的左表记录被过滤,和你遇到的现象完全一致。
原因解释
SQL的执行顺序导致了这个问题:
- 第一步优先执行JOIN关联逻辑:按照
on a.id = b.id做左关联时,左表T1的所有记录都会被保留,没有匹配到的T2字段会自动填充为NULL - 第二步才会执行WHERE子句的过滤逻辑:此时你设置的
b.category = 'office'、b.code = '245'条件中,左表未匹配到右表的记录对应的b.category、b.code都是NULL,而NULL和任意值做等值判断的结果都是UNKNOWN,会被WHERE条件直接剔除,最终效果等价于INNER JOIN,自然拿不到右表字段为NULL的左表记录。
解决方案
方案1(推荐):把右表过滤条件移到ON子句中
过滤逻辑在关联阶段执行,只会提前过滤右表不符合要求的记录再做关联,不会影响左表全量保留的逻辑:
select a.sales, b.profit from T1 a left join T2 b on a.id = b.id and b.category = 'office' and b.code = '245'
方案2:WHERE条件兼容NULL场景
如果必须把条件写在WHERE中,可以额外增加右表关联字段为NULL的判断:
select a.sales, b.profit from T1 a left join T2 b on a.id = b.id where (b.category = 'office' and b.code = '245') or b.id is null
内容的提问来源于stack exchange,提问作者Raja
相关产品推荐
相关产品推荐

