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 非空结果。
我有这个查询,其中 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 非空结果。