Запрос с использованием ключевого слова IN

Я учусь писать запросы TSQL. Я пытаюсь понять их глубже. Этот запрос, который я получил из учебника, требует, чтобы я проверял наличие NOT NULL во втором предложении WHERE.

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

Теперь таблица Sales.Customer имеет несколько значений NULL для PersonID. Если я удалю это предложение WHERE в подзапросе, я не получу никаких результатов. В моем явно ошибочном мышлении по этому вопросу я бы подумал, что если подзапрос вернет NULL, он просто не будет соответствовать условию предложения WHERE во внешнем запросе. Я ожидал бы получить результирующий набор для строк с PersonID, отличным от NULL. Почему это не работает в соответствии с этим рассуждением?


person user3366675    schedule 18.03.2014    source источник
comment
Похоже, что этот запрос пытается получить результат о людях, которые еще не являются клиентами. Вы говорите, дайте мне список строк из Persons.Person, где его BusinessEntityId НЕ находится в списке значений, отличных от NULL. В подзапросе конкретно указано, где Persons НЕ равен нулю, поэтому он вернет либо пустой набор, либо набор ненулевых значений.   -  person Mike Cheel    schedule 18.03.2014
comment
Новичкам может быть сложно понять, как SQL Server обрабатывает значения NULL. Значение NULL указывает, что значение неизвестно. Значение NULL отличается от пустого или нулевого значения. Никакие два нулевых значения не равны. Сравнение между двумя значениями NULL или между значением NULL и любым другим значением возвращает неизвестное значение, поскольку значение каждого значения NULL неизвестно. technet.microsoft.com/en-us/library /ms191504(v=sql.105).aspx   -  person Dave Mason    schedule 18.03.2014
comment
@DMason, вы должны оставить свой комментарий в качестве ответа.   -  person Crono    schedule 18.03.2014
comment
@DMason, у тебя правильный ответ. Опубликуйте это как ответ, и я отмечу это правильно.   -  person user3366675    schedule 18.03.2014


Ответы (3)


Новичкам может быть сложно понять, как SQL Server обрабатывает значения NULL. Значение NULL указывает, что значение неизвестно. Значение NULL отличается от пустого или нулевого значения. Никакие два нулевых значения не равны. Сравнение между двумя значениями NULL или между значением NULL и любым другим значением возвращает неизвестное значение, поскольку значение каждого значения NULL неизвестно.

Нулевые значения

person Dave Mason    schedule 18.03.2014
comment
Спасибо за ответ на мой вопрос. - person user3366675; 18.03.2014

Небольшое изменение, как показано ниже (column not in)

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

Ваш внутренний запрос возвращает все ненулевые идентификаторы личности, а внешний запрос получает все поля из таблицы лиц с ограничением на то, что BusinessEntityID не принадлежит идентификатору лица.

person Rahul    schedule 18.03.2014

NULL также может быть объяснен как UNKNOWN, поэтому, если одиночный NULL возвращается из вашего подзапроса, SQL Server не возвращает строк, потому что он не знает, содержится ли значение в результате или нет.

person user3366675    schedule 18.03.2014