Здравствуйте, sadomovalex, Вы писали:
[...]
Имено эта ситуация подробно рассматривается в книге
http://www.ozon.ru/context/detail/id/1952041/ на странице 96-97:
SELECT col1 FROM Table2 WHERE col1 NOT IN (SELECT col1 FROM Table1);
определяется как
SELECT col1 FROM Table2 WHERE NOT (col1 IN (SELECT col1 FROM Table1));
Раскрывая предикат IN получим:
SELECT col1 FROM Table2 WHERE NOT (col1 = ANY (SELECT col1 FROM Table1));
Что в свою очередь означает следующее:
SELECT col1 FROM Table2 WHERE NOT ((col1=first_value_in_domain) OR (col1=second_value_in_domain) OR ... OR (col1 = NULL));
Выражение (col1 = NULL) всегда дает в результате UNKNOWN. Раскрывая по правилам Де Моргана дизъюнкции, получаем:
... WHERE ((col1<>first_value_in_domain) AND (col1<>second_value_in_domain) AND ... AND UNKNOWN)
То есть начальный запрос эквиваленен (при наличии NULL-ов в Table1.col1)
SELECT col1 FROM Table2 WHERE UNKNOWN
Этому запросу не удовлетворяет ни одна строка.