Sql 在这种情况下,“不存在”似乎失败了——为什么?

Sql 在这种情况下,“不存在”似乎失败了——为什么?,sql,exists,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_

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

-- 
-- 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的
文档
与一个或多个
文档标记
相关联,这些标记又与一个或多个
标记组
相关联,这些标记组又与一个或多个
用户组
相关联。查询返回这些关联用户(在SELECT输出的第2列中)

现在我想重新构造查询-向我显示孤立文档不与任何用户关联的。。。所以我使用
不存在
如下:

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 
  )
如果比较这两个查询,您将看到前两个联接是相同的,而第三个联接已移动到“不存在”中

我不希望第二个查询返回文档314,因为第一个查询返回与其关联的用户但是,第二个查询返回文档id 314。。。作为孤立文档

为什么?


我可能遗漏了一些明显的东西,但我看不出是什么。帮助?

文档314(通过文档标签)与许多标签组相关联。其中一些标记组具有关联的用户组(使第一个查询成功),其他标记组没有关联的用户组(使第二个查询成功)


也就是说,您的第二个查询不会询问“此文档是否未与任何用户关联?”,而是询问“此文档是否与至少一个没有相应用户组的标记组关联?”.

从第二次查询返回文档314意味着文档314的某些标记位于一些没有关联用户组的标记组中


文档314可能仍有其他标记,或者它所拥有的标记可能位于其他标记组中,这些标记组具有关联的用户组,因此第一次查询也会返回非空结果。

可能存在孤立的
标记组
,也可能存在非孤立的
标记组
。尝试
左键加入用户组
并查看结果。@Bacon Bits:您的意思是在第一次查询中?这将证明什么——它已经返回了行,显示文档314与用户关联……是的,第一个查询带有左连接。您的EXISTS查询正在加入用户组以标记用户组。这意味着第二个查询不是显示孤立文档,而是显示孤立的标记组。这些不一定是同一件事。@BaconBits:是的,这就清楚了。谢谢谢谢暂时性失明:-)