Вы можете использовать агрегирование и фильтр с предложением having
.
Ваш запрос ссылается на таблицу client
, которую вы не выбираете - это синтаксическая ошибка. Вместо этого вы можете получить client_id
прямо из таблицы заказов.
select o.client_id, array_agg(p.conference_id) as conference_ids
from orders as o
inner join product as p on p.product_id = o.id
group by o.client_id
having count(*) filter(where not p.conference_id = any('{ 46545, 46543 }'::int[])) = 0
Обратите внимание, что order
- ключевое слово языка, поэтому это плохой выбор для имени таблицы; Вместо этого я переименовал его в orders
.
Если вы хотите, чтобы клиент размещал заказы на все конференции, перечисленные в массиве, вы можете добавить еще одно условие в предложение having
; вы можете сделать это независимо от количества элементов массивов с помощью array_length()
:
having
count(distinct p.conference_id)
filter(where p.conference_id = any('{ 46545, 46543 }'::int[])) = array_length('{ 46545, 46543 }'::int[], 1)
and count(*) filter(where not p.conference_id = any('{ 46545, 46543 }'::int[])) = 0