Множественный SELECT с NOT IN - внутренний оператор Select возвращает пустое значение, и весь SELECT возвращает пустое значение

Есть две таблицы TABLE1 и TABLE2, в которых есть общее поле ID. Я хотел получить значения из TABLE2, которые не совпадают с TABLE1 на основе значения ID.

select * from TABLE2 where subject = 1 and ID NOT IN (select ID from TABLE1 where subject = 1)

Образец:

TABLE1
ID SUBJECT
1 1

TABLE2
ID SUBJECT
1 1
2 1

Ожидаемый результат равен 2, и он отлично работает.

Но когда TABLE1 пуста или внутренняя select ID from TABLE1 where subject = 1 возвращает пустое значение, весь оператор select возвращает пустое значение. Но ожидаемый результат 1, 2

Есть ли способ добиться этого?


person Tivakar    schedule 20.05.2013    source источник


Ответы (2)


Используйте left join

select t2.* 
from table2 t2
left outer join table1 t1 on t1.id = t2.id and t1.subject = 1
where t2.subject = 1
and t1.id is null

См. хорошее объяснение соединений

person juergen d    schedule 20.05.2013
comment
Это неправильно. Предложение where превращает left outer join в inner join. - person Gordon Linoff; 21.05.2013
comment
При этом возвращается пустое значение. когда я удалил t2.subject = 1, он отлично работает. Но я не мог понять, почему его нужно удалить. - person Tivakar; 21.05.2013
comment
После редактирования Гордоном Линоффом все работает нормально. Спасибо Юрген и Гордон Линофф - person Tivakar; 21.05.2013

Думаю можно использовать не exists и для этой работы -

select * from TABLE2 where subject = 1 and NOT exists
(select 1 from TABLE1 where subject = 1 and table1.id = table2.id)
person pratik garg    schedule 20.05.2013