Предикат NOT IN |
||||||||||||||||||||||||||||
Рассмотрим еще один пример, позаимствованный мной у Селко [7]. Идея его состоит в использовании предиката NOT IN (<список значений, включающий NULL>). Опять таки, для того чтобы вы могли проверить справедливость рассуждений на сайте, давайте искусственно добавим NULL-значения в результат запроса:
Мы специально взяли 1915 год, чтобы результирующий набор был невелик. Вот он:
А теперь напишем запрос, который должен вернуть все корабли, год спуска на воду не находится в наборе значений столбца year:
Запрос дает нам следующий набор кораблей:
Казалось бы, мы должны получить корабли Hiei и Kongo, так как год их спуска на воду известен и не равен 1915. Но нет, мы опять получаем пустой результирующий набор. Оценим значение предиката для первого из этих кораблей — Hiei (для остальных все будет аналогично). Итак,
Еще одно NULL-значение мы опустили для краткости. Последний предикат можно заменить следующим:
Последнее выражение всегда равно UNKNOWN, следовательно, предикат можно переписать в виде:
Следовательно, и все выражение будет равно UNKNOWN, так как первое сравнение дает TRUE. Если бы первое сравнение было ложным (для 1915 года), то результат всего выражения был бы равен FALSE. Поэтому можно сделать вывод, что при наличии NULL-значения в наборе предикат NOT IN в предложении WHERE всегда будет давать пустой набор записей. В заключение следует сказать, что если вы выполняете горизонтальную фрагментацию некоторой таблицы, используя некоторое пороговое значение столбца, допускающего NULL-значения, то объединение фрагментов типа
|