【发布时间】:2015-04-30 15:47:25
【问题描述】:
我已经阅读了几篇描述与我非常相似的问题的帖子,但我还没有能够解决我的问题。就是这样:
有表 A、B、C 和 D。表 D 被其他 3 个表引用,只有表 (A) 有一个“可为空”外键,我需要找到 D 中不是的行被其他 3 个表中的任何一个指向/引用。到目前为止,我已经能够过滤所有行,包括我想用这段代码找到的行:
SELECT D.Id as Id, A.Id as A_Id, B.Id as B_Id, C.Id as C_Id
FROM D
LEFT OUTER JOIN A --this is the nullable one
ON D.Id = A.D_Id
LEFT OUTER JOIN B
ON D.Id = B.D_Id
LEFT OUTER JOIN C
ON D.Id = C.D_Id
虽然我可以通过查看结果在结果中看到我需要的行,并且如果我尝试按 IS NULL 过滤,它们将外键字段显示为空,但我根本没有得到任何结果,这是我使用的查询:
SELECT D.Id as Id, A.Id as A_Id, B.Id as B_Id, C.Id as C_Id
FROM D
LEFT OUTER JOIN A --this is the nullable one
ON D.Id = A.D_Id
LEFT OUTER JOIN B
ON D.Id = B.D_Id
LEFT OUTER JOIN C
ON D.Id = C.D_Id
WHERE A.D_Id IS NULL AND B.D_Id IS NULL AND C.D_Id IS NULL
任何帮助将不胜感激。 提前致谢
编辑
我已经尝试过了,虽然它是一种非常不同的方法,但它确实有效:
SELECT *
FROM D
WHERE Id not in (Select D_Id from A)
and Id not in (Select D_Id from B)
and Id not in (Select D_Id from C)
【问题讨论】:
-
您的第二个查询看起来正确...
-
@Blim 他的第二个查询在技术上应该可以正常工作,就像您放在那里的数据一样。我想如果没有完整的表结构和他的数据看起来,这使得这更难弄清楚。
-
是的,它几乎是正确的。看看我的回答你好应该检查一个不可为空的列,如 A.Id、B.Id、C.Id。
标签: sql sql-server sql-server-2008