【发布时间】:2014-04-24 16:55:22
【问题描述】:
我正在学习如何编写 TSQL 查询。我试图深入了解它们。我从教程中获得的这个查询要求我在第二个 WHERE 子句中检查 NOT NULL。
SELECT *
FROM Person.Person AS p
WHERE NOT p.BusinessEntityID IN (
SELECT PersonID
FROM Sales.Customer
WHERE PersonID IS NOT NULL);
现在表 Sales.Customer 的 PersonID 有一些 NULL 值。如果我在子查询中删除此 WHERE 子句,则不会返回任何结果。在我对此事的明显错误思考中,我认为如果子查询返回 NULL 它根本不满足外部查询中 WHERE 子句的条件。我希望获得 PersonID 不为 NULL 的行的结果集。为什么按照这个推理它不起作用?
【问题讨论】:
-
此查询似乎试图生成尚未成为客户的人的结果。你是说给我一个来自 Persons.Person 的行列表,其中它的 BusinessEntityId 不在非空值列表中。子查询明确说明 Persons 不为空的位置,因此它将返回一个空集或一组非空值。
-
了解 SQL Server 如何处理 NULL 值对于新手来说可能很困难。 NULL 值表示该值未知。 NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。 technet.microsoft.com/en-us/library/ms191504(v=sql.105).aspx
-
@DMason 你应该把你的评论作为答案。
-
@DMason 你有正确的答案。将其发布为答案,我会将其标记为正确。
标签: sql sql-server tsql in-operator