В чем есть логическое отличие использования подзапросов в NOT EXISTS и логическом операторе NOT IN (...) в следующих двух SQL-запросах ?
SELECT *
FROM facts f
WHERE f.id NOT IN (SELECT idnum
FROM dict);
SELECT *
FROM facts f
WHERE NOT EXISTS (SELECT 1
FROM dict d
WHERE d.idnum = f.id);
Ответ: если подзапрос (select idnum from dict) в запросе с NOT IN возвращает хотя бы одно значение NULL, то всё логическое выражение становится ложным, т.е. весь запрос ничего не вернёт. При использовании EXISTS, значения NULL обрабатываются корректно, т.е запрос вернёт какие-то строки при их наличии.
Я бы сказал, что речь идёт о некоем баге, так как при использовании подзапроса в логическом IN знечение NULL не оказывает такого фатального эффекта, т.е. логическое условие выполняется как обычно логично корректно.
Комментариев нет:
Отправить комментарий