3

我正在学习如何编写 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 的行的结果集。为什么按照这个推理它不起作用?

4

3 回答 3

2

了解 SQL Server 如何处理 NULL 值对于新手来说可能很困难。NULL 值表示该值未知。NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。

空值

于 2014-03-18T19:40:50.893 回答
1

稍作改动如下图(column not in

SELECT *
FROM Person AS p
WHERE p.BusinessEntityID NOT IN (  <-- Here
    SELECT PersonID
    FROM Sales.Customer
    WHERE PersonID IS NOT NULL);

您的内部查询返回所有非空 personid 和外部查询从 person 表中获取所有字段,但 BusinessEntityID 不属于 personid。

于 2014-03-18T19:34:18.853 回答
0

NULL 也可以解释为 UNKNOWN,因此如果从子查询返回单个 NULL,SQL Server 不会返回任何行,因为它不知道结果中是否包含值。

于 2014-03-18T19:40:09.970 回答