首页 > 解决方案 > 在 WHERE 子句中的 JOIN 中写入条件时结果是否不同?

问题描述

使用条件 inwhere和 in的结果有区别join吗?在我的实际查询中,我可以AND "noteReads"."id" IS NULL输入where或输入join. 这有关系吗?

带有AND "noteReads"."userId" = 1in 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
);

标签: sqlpostgresqljoin

解决方案


绝对地。

当您"noteReads"."id" IS NULLONa 子句中有条件时LEFT JOIN,它只考虑 a 所在的idNULL。我猜这绝不是真的。

WHERE子句中有条件时, if 过滤掉不匹配的行。那是非常不同的。

注意:这个解释特定于 a 中的第二个表LEFT JOIN(或 a 中的第一个表RIGHT JOIN,尽管我通常建议使用LEFT JOINs)。


推荐阅读