Re: MSSQL 2000: теоретический вопрос по NULL (ANSI_NULLS ON)
От: GreatDrag Украина  
Дата: 11.12.06 18:54
Оценка: 24 (4)
Здравствуйте, sadomovalex, Вы писали:

[...]

Имено эта ситуация подробно рассматривается в книге http://www.ozon.ru/context/detail/id/1952041/
Автор(ы): Джо Селко
Издательство: Лори
Цена: 365р.

Книга "SQL для профессионалов" стала первым изданием, посвященным исключительно сложным технологиям SQL, освоение которых способно сделать читателя экспертом в этой области. В нынешнем обновленном издании автор книги Джо Селко в увлекательной и
на странице 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
Этому запросу не удовлетворяет ни одна строка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.