2014-03-18 2 views
3

Я изучаю, как писать запросы 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. Почему это не работает в соответствии с этими соображениями?

+0

Этот запрос, как представляется, пытается получить результат людей, которые еще не клиенты. Вы говорите, что дайте мне список строк из Person.Person, где его BusinessEntityId НЕ входит в список значений, отличных от NULL. В подзапросе указано, что люди не имеют значения null, поэтому он возвращает либо пустой набор, либо набор ненулевых значений. –

+1

Понимание того, как значения NULL обрабатываются SQL Server, может быть трудным для новичков. Значение NULL указывает, что значение неизвестно. Значение NULL отличается от пустого или нулевого значения. Нет двух нулевых значений. Сравнение двух нулевых значений или между NULL и любым другим значением возвращается неизвестно, поскольку значение каждого NULL неизвестно. http://technet.microsoft.com/en-us/library/ms191504(v=sql.105).aspx – DMason

+0

@DMason вы должны сделать свой комментарий в качестве ответа. – Crono

ответ

2

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

Null Values

+0

Спасибо, что ответили на мой вопрос. – user3366675

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 и внешний запрос получает все поля от человека таблицы с ограничением, что BusinessEntityID не принадлежит PersonId.

0

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