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. Так что будьте внимательны, когда пишите свой код!