sql - 在 WHERE 子句中的 JOIN 中写入条件时结果是否不同?
问题描述
使用条件 inwhere
和 in的结果有区别join
吗?在我的实际查询中,我可以AND "noteReads"."id" IS NULL
输入where
或输入join
. 这有关系吗?
带有AND "noteReads"."userId" = 1
in where 子句的第一个版本:
SELECT count(distinct("notes"."id")) FROM "notes"
LEFT OUTER JOIN "noteReads" ON "notes"."id" = "noteReads"."noteId"
AND "noteReads"."userId" = 1
WHERE (
"notes"."archivedAt" IS NULL
AND "notes"."authorId" != 1
AND "noteReads".id IS NULL
);
AND "noteReads"."userId" = 1
带有in join 子句的第二个版本:
SELECT count(distinct("notes"."id")) FROM "notes"
LEFT OUTER JOIN "noteReads" ON "notes"."id" = "noteReads"."noteId"
AND "noteReads"."userId" = 1
AND "noteReads"."id" IS NULL
WHERE (
"notes"."archivedAt" IS NULL
AND "notes"."authorId" != 1
);
解决方案
绝对地。
当您"noteReads"."id" IS NULL
在ON
a 子句中有条件时LEFT JOIN
,它只考虑 a 所在的id
行NULL
。我猜这绝不是真的。
当WHERE
子句中有条件时, if 过滤掉不匹配的行。那是非常不同的。
注意:这个解释特定于 a 中的第二个表LEFT JOIN
(或 a 中的第一个表RIGHT JOIN
,尽管我通常建议使用LEFT JOIN
s)。
推荐阅读
- reactjs - Reactjs,类组件到钩子
- swift - 测试动态按钮视图
- jquery - 从 daterangepicker 中禁用或删除 mintues 下拉菜单
- .net - 通过依赖注入使用 Blazor Webassembly 进行 gRPC-Web 通道身份验证
- python - CNN Scraper 偶尔在 python 中工作
- ios - iOS 登录提示使用捆绑名称取消关注
- python - Python Selenium - 尝试在表格元素中的文本更改时编写等待条件
- python - Anaconda 中的 python 环境问题
- c++ - 等到变量变为零
- swift - 在 XCUITest/Simulator 中更改键盘