Почему SQL-запрос «не существует» работает, а «не в» - нет - PullRequest
5 голосов
/ 02 апреля 2010

Я потратил некоторое время, пытаясь выяснить, почему этот запрос не дает ожидаемых результатов:

SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS)

наконец-то я попытался написать запрос по-другому, и это привело к получению ожидаемых результатов:

SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN)

Первый запрос кажется более подходящим и «правильным». Я использую «в» и «не в» все время для аналогичных выборов и никогда не было проблемы , о которой я знаю .

Ответы [ 2 ]

11 голосов
/ 02 апреля 2010

Если вы выписываете синтаксический сахар, x not in (1,2,3) становится:

x <> 1 AND x <> 2 AND x <> 3

Таким образом, если столбец ssn содержит нулевое значение, первый запрос эквивалентен:

WHERE ESPSSN <> NULL AND ESPSSN <> ...

Результат сравнения с NULL неизвестен, поэтому запрос ничего не даст.

2 голосов
/ 02 апреля 2010

Как сказал Андомар, остерегайтесь значений NULL при использовании NOT IN

Также обратите внимание, что запрос, использующий предикат NOT IN, всегда будет выполнять вложенное полное сканирование таблицы, тогда как запрос, использующий NOT EXISTS, может использовать индекс в рамках подзапроса и в результате будет намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...