我有这个查询,它返回多行:
--
-- 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
返回多行的事实告诉我,ID为314的document
与一个或多个document_tags
相关联,而tag_groups
又与一个或多个{{1}相关联},它们又与一个或多个user_groups
相关联。查询返回这些关联的用户(在SELECT输出的第二列中)。
现在我想重新构建查询 - 向我展示孤立的文档...... 与任何用户无关的 ...所以我使用{{ 1}}像这样:
NOT EXISTS
如果比较两个查询,您会看到前两个连接是相同的 - 第三个连接已移入NOT EXISTS。
我不希望第二个查询返回文档314 - 因为第一个查询返回与之关联的用户。 然而,第二个查询返回文档ID 314 ...作为孤立文档。
为什么?
我可能错过了一些明显的东西 - 但我无法看清楚。帮助
答案 0 :(得分:2)
文档314与许多tag_groups(通过document_tags)相关联。其中一些tag_groups具有关联的user_groups(使第一个查询成功),其他tag_groups没有关联的user_groups(使第二个查询成功)。
也就是说,您的第二个查询并不会询问"此文档是否与任何用户无关?",它要求"此文档与至少一个tag_group相关联没有相应的user_group?"。
答案 1 :(得分:0)
从第二查询返回的文档314意味着文档314具有一些标签组中的一些标签,这些标签组不具有关联的用户组。
文档314可能仍然有其他标记,或者它可能还存在于其他标记组中的标记,具有关联的用户组,因此第一个查询也返回非空结果的原因。