【发布时间】:2020-11-10 15:48:44
【问题描述】:
在where 和join 中使用条件的结果是否存在差异?在我的实际查询中,我可以将AND "noteReads"."id" IS NULL 放入where 或join。这有关系吗?
在 where 子句中带有 AND "noteReads"."userId" = 1 的第一个版本:
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 的第二个版本:
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
);
【问题讨论】:
-
distinct不是函数,这里是。直接写 count(distinct "notes"."id"),让代码更清晰。 -
顺便说一句,第一个查询是一个反连接(您可以计算 不存在用户 1 读取的便笺的便笺)。更好地使用
NOT EXISTS或NOT IN以获得更易读的查询。
标签: sql postgresql join