sql - 找到所有不是 parent 的 child

标签 sql sql-server sql-server-2012

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

相关文章:

mysql - sql外键的使用方法

c# - 如何使用sql从四个sql表在rdlc中显示销售摘要

asp.net - 对于一个存储过程调用,SQL 登录从 Web 应用程序失败

SQL COUNT 按具有多个日期字段的每个日期

c# - 如何对可以属于多个聚合的 ValueObject 进行建模

sql-server - TRY_PARSE 但更快

mysql - 无法创建互连表

python - 非阻塞客户端中的事务?

c# - SqlBulkCopy 性能

sql - 禁止存储过程中的事务