gpt4 book ai didi

sql - 找到所有不是 parent 的 child

转载 作者:行者123 更新时间:2023-12-02 01:17:30 24 4
gpt4 key购买 nike

我正在尝试检索所有不是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com