Если в колонке внутри подзапроса not in
возможно появление null
то это может привести к неверному поведению.
Рассмотрим пример, сделаем две таблицы:
1 2 3 4 5 6 7 |
create table test.table1 as select value v from table(sys.odcinumberlist(1, 2, 3)); create table test.table2 as select value v from table(sys.odcinumberlist(1, 3, null)); |
Запрос с in
возвращает то что ожидается
1 2 3 4 5 6 |
select t.value from test.table1 t where t.value in (select t.value from test.table2); |
1
3
А вот запрос с not in
не возвращает вообще ничего
1 2 3 4 5 6 |
select t.value from test.table1 t where t.value not in (select t.value from test.table2); |
И так будет всегда если в результате подзапроса присутствует null
. Таким образом, если делается запрос с not in
, всегда нужно проверить что колонка в подзапросе является not null
. Или заменить условие, например на not exists.
Подробная статья про поведение null
в Oracle, в том числе разобрана ситуация с not in
.