Вы всегда должны использовать not exists
с подзапросами. Он обрабатывает NULL
значения интуитивно понятным способом.
Если у вас есть:
where t.id not in (select x.id from x)
И x.id
равно когда-либо NULL
, тогда никаких строк не возвращаются вообще. Это из-за определения NULL
значений.
Эквивалентная формулировка:
where not exists (select 1 from x where x.id = t.id)
ведет себя так, как вы ожидаете.
Еще одним преимуществом not exists
является то, что вы можете обрабатывать несколько столбцов одновременно:
where not exists (select 1 from x where x.id = t.id and x.date = t.date)
Некоторые базы данных поддерживают кортежи, что позволяет вам выражать это как not in
, но не все делают.