sql - 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)
这些什么时候不会返回相同的结果?
解决方案
与 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 子句中丢失。
推荐阅读
- python - 从 Python 中的 Pandas DataFrame 中随机删除 n 个连续的、不重叠的行
- r - R:while 和 if-else 循环
- docker - 如何创建两个共享代码和资产的 NestJS 存储库?
- android - 尝试通过选择器共享图像时未出现主题和文本
- .net - .NET 5 中的 .NET 插件基础结构和 PowerShell:无法调用 Get-Disk cmdlet
- android-button - 单击报告错误按钮时如何收到报告错误消息
- sql - VS Code 启动配置中的反引号无法转义 SQL 查询中具有特殊字符的列
- powershell - 自动从 Invoke-RestMethod 展开所有数组并在 PowerShell 中保存到 CSV
- android - gradlew.bat 文件没有被 vscode 丢弃
- windows - 当我尝试在 Windows 10 上从系统环境变量打开路径时,它不会以列表格式显示