【问题标题】:Query using IN keyword使用 IN 关键字查询
【发布时间】: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


【解决方案1】:

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

Null Values

【讨论】:

  • 感谢您回答我的问题。
【解决方案2】:

稍作改动如下图(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 和外部查询获取所有字段 来自具有 BusinessEntityID 不属于 personid 限制的人员表。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2016-04-05
      相关资源
      最近更新 更多