首页 > 解决方案 > SQL 左连接与 JOIN 条件中的过滤器与 WHERE 子句中的过滤器

问题描述

我正在重构一些工作中的 sql,并且偶然发现了一些我不知道如何解释的东西。我认为有两个查询会产生相同的结果,但不会,我不知道为什么。

查询如下:

select *
from TableA as a
left join TableB b on a.id = b.id and b.status in (10, 100)

select *
from TableA as a
left join TableB b on a.id = b.id
where b.status is null or b.status in (10, 100)

这些什么时候不会返回相同的结果?

标签: sqlsql-servertsqljoinouter-join

解决方案


与 Where 条件的最大区别b.status is null or b.status in (10, 100) 是当 b.status 是 1 以及 b.id=a.id

在第一个查询中,您仍然会从表 A 中获取相应 B 部分为 NULL 的行,因为 On 条件未完全满足。在第二个查询中,您将获得 JOIN 中 a 和 b 表的行,这些行将在 where 子句中丢失。


推荐阅读