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

时间:2015-08-02 21:43:53

标签: sql exists

我有这个查询,它返回多行:

-- 
-- 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 ...作为孤立文档

为什么?

我可能错过了一些明显的东西 - 但我无法看清楚。帮助

2 个答案:

答案 0 :(得分:2)

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

也就是说,您的第二个查询并不会询问"此文档是否与任何用户无关?",它要求"此文档与至少一个tag_group相关联没有相应的user_group?"。

答案 1 :(得分:0)

从第二查询返回的文档314意味着文档314具有一些标签组中的一些标签,这些标签组不具有关联的用户组。

文档314可能仍然有其他标记,或者它可能还存在于其他标记组中的标记,具有关联的用户组,因此第一个查询也返回非空结果的原因。