NOT EXISTS 在这种情况下似乎失败了——为什么?

NOT EXISTS seems to fail in this case - why?

我有这个查询,其中 return 有许多行:

-- 
-- documents -> document_tags -> tag_groups -> user_groups
--
SELECT documents.id, user_groups.user_id
FROM documents
  JOIN document_tags ON documents.id = document_tags.document_id
  JOIN tag_groups ON document_tags.tag_id = tag_groups.tag_id
  JOIN user_groups ON tag_groups.group_id = user_groups.group_id 
WHERE
  documents.id = 314

许多行被 returned 的事实告诉我,ID 为 314 的 document 与一个或多个 document_tags 相关联,后者又与一个或多个 tag_groups,它们又与一个或多个 user_groups 相关联。查询 returns 这些关联用户(在 SELECT 输出的第 2 列)。

现在我想重组查询 - 向我显示 孤立 文档...与任何用户都没有关联 ...所以我这样使用 NOT EXISTS

SELECT documents.id
FROM documents
  JOIN document_tags ON documents.id = document_tags.document_id
  JOIN tag_groups ON document_tags.tag_id = tag_groups.tag_id
WHERE
  NOT EXISTS (
    SELECT 1 FROM user_groups 
    WHERE user_groups.group_id = tag_groups.group_id 
  )

如果比较这两个查询,您会发现前两个联接是相同的 - 第三个联接已移至 NOT EXISTS。

我不希望第二个查询 return 文档 314 - 因为第一个查询 returns 与之关联的用户。 然而,这第二个查询 returns 文档 id 314... 作为孤立文档

为什么?

我可能遗漏了一些明显的东西 - 但我看不到什么。帮忙?

文档 314 与许多 tag_groups 关联(通过 document_tags)。其中一些 tag_groups 关联了 user_groups(使第一个查询成功),其他人没有关联 user_groups(使第二个查询成功)。

也就是说,您的第二个查询不询问 "is this document NOT associated with ANY users whatsoever?",而是询问 "is this document associated with at least one tag_group that doesn't have a corresponding user_group?"。

从第二个查询返回文档 314 意味着文档 314 有 some 标签在 some 标签组中没有关联的用户组。

文档 314 可能还有其他标签,或者它所拥有的标签可能还在其他标签组中, 关联的用户组,因此为什么第一个查询也 returns 非空结果。