2015-08-23 2 views
-6

Теоретически, вы можете использовать как NOT IN, так и NOT EXISTS как часть одного и того же запроса, возможно, в подзапросе?Можете ли вы использовать NOT IN и NOT EXISTS в том же запросе?

+1

Да, вы можете, SELECT * FROM mytable WHERE col NOT IN ('a', 'b') И НЕ СУЩЕСТВУЕТ (SELECT * FROM anothertable WHERE anothertable.col2 = mytable.col2) ' –

ответ

1

Да, вы можете.

WHERE EXISTS (SELECT * FROM cities_stores 
       WHERE cities_stores.store_type = stores.store_type) and stores.store_type NOT IN(...); 
0

Почему нет ..

CREATE TABLE Test9 (ID int) 

INSERT INTO Test9 values (1), (2), (3), (4) 

SELECT * 
FROM test9 
WHERE id NOT IN (1) 
AND EXISTS (SELECT 1 FROM test9 WHERE id = 1) 
0

Конечно, вы можете, но быть осведомлены о различиях между как в отношении пустой (NULL) атрибуты. Там вы можете получить смешанные результаты. Когда подзапрос возвращает хотя бы один нуль, NOT IN не будет соответствовать никаким строкам.

Причины этого можно найти, посмотрев детали того, что на самом деле означает операция NOT IN.

Скажем, для целей иллюстрации, что существуют 4 строки в таблице называемые т, есть столбец с именем ID со значениями 1..4

WHERE SomeValue NOT IN (SELECT AVal FROM t) 

эквивалентно

WHERE SomeValue != (SELECT AVal FROM t WHERE ID=1) 
    AND SomeValue != (SELECT AVal FROM t WHERE ID=2) 
    AND SomeValue != (SELECT AVal FROM t WHERE ID=3) 
    AND SomeValue != (SELECT AVal FROM t WHERE ID=4) 

Давайте далее говорят, что AVal NULL, где ID = 4. Следовательно, что! = сравнение возвращает UNKNOWN. В логической таблице истинности для AND указано, что UNKNOWN и TRUE UNKNOWN, UNKNOWN и FALSE FALSE. Нет значения, которое может быть AND с UNKNOWN для получения результата TRUE

Следовательно, если любая строка этого подзапроса возвращает NULL, весь оператор NOT IN будет оценивать либо FALSE, либо NULL, и никакие записи не будут возвращены

Обратите внимание на сообщение this за дополнительной информацией.

Смежные вопросы