SQL 左连接 JOIN 条件中的过滤器与 WHERE 子句中的过滤器

标签 sql sql-server tsql join outer-join

我在工作中重构一些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)

什么时候它们不会返回相同的结果?

最佳答案

与Where条件的最大区别b.status为null或b.status in (10, 100) 是当 b.status 为 1 且 b.id=a.id

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

关于SQL 左连接 JOIN 条件中的过滤器与 WHERE 子句中的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272263/

相关文章:

sql-server - Azure SQL : Create login user only if not exists

SQL Server 替换不在范围内的字符

sql - 如果记录已存在,则停止在表中插入

sql-server-2008 - 在 CTE 查询中使用聚合函数

mysql - 如果类别至少有三个系列,如何返回数据

java - 复合选择的 Hibernate 查询版本

sql - 如何知道在哪一列上应用了序列?

C# 安全地构建 SQL 字符串以使用 Entity Framework 执行

sql - 如何级联/删除这个场景?出现多个级联错误

tsql - 如何使用 NHibernate ICriteria 进行分组、获取关联和 T-SQL 函数