Я изучаю, как писать запросы TSQL. Я пытаюсь понять их подробно. Этот запрос, который я получил из учебника, требует, чтобы я проверял NOT NULL во втором предложении WHERE.Запрос с использованием ключевого слова IN
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.Person, где его BusinessEntityId НЕ входит в список значений, отличных от NULL. В подзапросе указано, что люди не имеют значения null, поэтому он возвращает либо пустой набор, либо набор ненулевых значений. –
Понимание того, как значения NULL обрабатываются SQL Server, может быть трудным для новичков. Значение NULL указывает, что значение неизвестно. Значение NULL отличается от пустого или нулевого значения. Нет двух нулевых значений. Сравнение двух нулевых значений или между NULL и любым другим значением возвращается неизвестно, поскольку значение каждого NULL неизвестно. http://technet.microsoft.com/en-us/library/ms191504(v=sql.105).aspx – DMason
@DMason вы должны сделать свой комментарий в качестве ответа. – Crono