У меня есть этот запрос, который работает:
select name, location_id from all_names
where location_id in (1,2,3)
and name in(select name from my_names)
and (name, location_id) not in (select name,location_id from my_names);
Цель этого запроса - найти все кортежи name, location_id в all_names, которых нет в my_names, если эти имена ARE в my_names.
Будучи относительно любителем SQL, я попытался провести некоторое исследование, чтобы исправить этот запрос, но он не совсем работает. В основном я пытался использовать кортежи внешнего соединения (name, location_id) из my_name и all_names и идентифицировать те строки, которые возвращают нули, потому что это будут строки, которые не имеют соответствия.
select data.name, data.location_id
from
(select all.name, all.location_id, my.name, my.location_id l_id
from (select name, location_id
from all_names
where location_id in (1,2,3)
)all,
(select name, location_id
from my_names
)my
where all.name = my.name(+)
and all.location_id = my.location_id(+)) data
where data.l_id is null
and data.name is null;
Это работает всякий раз, когда я добавляю "где data.name = 'SomeSpecificName'", но когда я просто запускаю его без него, он возвращает слишком много строк. Можете ли вы помочь мне понять, где я иду не так?