К основному контенту

MSSQL - IN не равно EXISTS

10 лет я пользовался предикатом IN,
не подозревая, что получаю неверные результаты.
Выяснил случайно, заметив, что на больших объемах
IN работает крайне медленно.
Итак.
SELECT COUNT(*) FROM TABLE1 A WHERE A.FIELD1 NOT IN (SELECT B.FIELD2 FROM TABLE2 B)

SELECT COUNT(*) FROM TABLE1 A WHERE NOT EXISTS (SELECT * FROM TABLE2 B WHERE B.FIELD2=A.FIELD1)

Так вот с точки зрения логики оба запроса одинаковы.
Но, оказывается, первый будет вести себя не предсказуемо
в случае если в колонке FIELD1 или FIELD2 содержатся NULL-значения.
Причем, на поведение влияет некий параметр из-за которого по разному
интерпритируются нулевые значения.
Кроме того, второй запрос в отличие от первого не выполняет полный
перебор на поиск значения, а прерывается при нахождении значения).
Кроме T-SQL SQLSERVER, аналогично ведет себя запрос и в Oracle.
Так что будьте внимательны, когда пишите свой код!

Комментарии

  1. Столкнулся с этим на собеседовании. Спасибо, теперь разобрался

    ОтветитьУдалить
  2. Нет проблем, кстати, на собеседованиях часто спрашивают банальные вещи, оценивая память человека и его багаж(опыт, образование и т.п.), а не самого человека. Поэтому хорошая память и быстрая реакция очень важны при собеседовании. Мне знание этого факта не помогло(поставили задачу не указав ключевой столбец, т.е. задача не имела решения). Вообщем, это все неважно. Думаю вот написать пару статей про D(ди) - высокоуровневый язык для системного и прикладного программирования.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Кирилица в Arch Linux

После вчерашних обновлений в консоли Arch Linux при выборе русской локали вместо букв печатаются белые квадратики. Очевидно, что по какой-то причине не загружается прописанный в rc.conf шрифт. Временное лекарство от этого: выполнить команду setfont cyr-sun16 . Еще у меня в момент начальной загрузки появляется рябь на экране как от сильных электромагнитных помех в ЭЛТ, хотя у меня ЖК. Может быть это как-то связано.

Сортировка массивов в groovy

Любой массив в java и groovy можно отсортировать статическим методом: Arrays.sort(c); причем это будет очень быстро сто тысяч элементов типа int сортируются за 1 секунду на celeron M 1,8 Mg. Если это массив объектов можно использовать перегруженный метод Arrays.sort(c,comporator);

Arch Linux - руссификация консоли

Вчера, придя с работы, как всегда затеял InstallFest. Уже практически не задумываясь установил свежий арч. И тут заметил что в tty вместо русского - квадратики. Под утро нашел таки сообщение на форме, что в этом виноваты дрова от видео. Там правда речь шла о нвидиа, а у меня ати. Буду пробовать. И еще в lxterminal обратил внимание что сообщения на русском, а то что я вводил на русском потом возвращается системой в виде юникод-символов. Вот такие дела. UPDATE: драйвер не причем. переустановил в консоли(до установки X) по прежнему квадратики вместо букв. неужели придется переключатся на инглиш? Заметил что initscripts скачался c какого-то зеркала не с яндекса. возможно причина в нем.