我正在尝试检索所有不是 parent 的 child 。
表格看起来像这样
ID | ParentID
---------------
1 NULL
2 1
3 NULL
4 2
一开始我尝试过
SELECT *
FROM [SMD].[dbo].[ProposalFollowUp]
WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp])
但它不返回任何行。 我想选择不在parentID 中的所有行。我不明白为什么它不起作用。
然后我尝试了这个
SELECT *
FROM [SMD].[dbo].[ProposalFollowUp] AS a
WHERE a.ID NOT IN
(SELECT b.ID FROM [SMD].[dbo].[ProposalFollowUp] as b WHERE b.ParentID = a.ID)
但这会返回所有行
任何人都可以告诉我我错过了什么
谢谢!
最佳答案
使用not in
暴露了一个众所周知的 SQL 怪癖:
WHERE ID NOT IN (SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp])
要了解原因,请扩展查询:
WHERE ID NOT IN (null, 1, null, 2)
这意味着:
where id <> null and id <> 1 and id <> null and id <> 2
诀窍是 id <> null
从来都不是真的。在 SQL 中 three-valued logic ,其计算结果为 unknown
。这意味着您的 where 子句永远不会批准任何行。
要解决此问题,请使用 exists
(就像蒂姆·施梅尔特的回答),或排除 null
来自子查询:
WHERE ID NOT IN (
SELECT ParentID FROM [SMD].[dbo].[ProposalFollowUp] WHERE ParentID IS NOT NULL)
关于sql - 找到所有不是 parent 的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602342/