使用IN关键字查询

时间:2014-03-18 19:22:17

标签: sql sql-server tsql in-operator

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

3 个答案:

答案 0 :(得分:2)

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

Null Values

答案 1 :(得分: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);

您的内部查询返回获取所有字段的所有非null personid和外部查询 来自人员表的限制,BusinessEntityID不属于personid。

答案 2 :(得分:0)

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