Вы хотите получить C
записей с версией продукта = 2, для которых существует F
записей с версией продукта = 1 и не существует F
записей с версией продукта <> 1.
Надеюсь Не знаю, почему есть отдельная таблица OUI
. Можно было бы ожидать, что версия продукта будет представлять собой простой столбец в таблицах C
и F
.
Итак, давайте используем два предложения with, чтобы перейти к лучшим таблицам: -)
with better_c as (select c.*, oui.product_version from c join oui on oui.rel_id = c.id)
, better_f as (select f.*, oui.product_version from f join oui on oui.rel_id = f.id)
Реальный запрос может быть записан с помощью INTERSECT
и EXECPT
:
with ...
select id from better_c where product_version = 2
intersect
select parent_id from better_f where product_version = 1
except
select parent_id from better_f where product_version <> 1;
То же с [NOT] EXISTS
:
with ...
select id
from better_c
where product_version = 2
and exists
(select null from better_f where product_version = 1 and parent_id = better_c.id)
and not exists
(select parent_id from better_f where product_version <> 1 and parent_id = better_c.id);
То же с [NOT] IN
:
with ...
select id
from better_c
where product_version = 2
and id in (select parent_id from better_f where product_version = 1)
and id not in (select parent_id from better_f where product_version <> 1);