Выберите данные, имеющие все значения в массиве

#sql #postgresql

#sql #postgresql

Вопрос:

вот моя проблема:
у меня есть таблица idtypedata , состоящая из двух столбцов:

  • IDdata
  • IDtype

Оба они не уникальны.

Я хочу вывести таблицу, отображающую IDdata каждый раз все вхождения, в которых данный список был найден IDtype для одного и того же IDdata .

В качестве примера:

с помощью списка (12,5)

 IDdata    IDtype
 221        12
 221        5
 157        12
 187        5
  

Запрос должен возвращать только IDdata при IDtype выполнении всех параметров списка:

 IDdata
 221
  

Ответ №1:

Это также известно как реляционное разделение:

 select iddata
from idtypedata
where idtype in (12,5)
group by iddata
having count(distinct idtype) = 2;
  

Однако это также вернет iddata значения, которые также имеют другие idtypes (например, 12,5,6).

Чтобы сделать условие для предложения having независимым от фактического количества проверяемых идентификаторов, я бы переместил список идентификаторов в CTE:

 with idlist (id) as (
  values (12), (5)
)
select iddata
from idtypedata
where idtype in (select id from idlist)
group by iddata
having count(distinct idtype) = (select count(*) from idlist);
  

Чтобы получить данные, содержащие именно эти два элемента, вы можете использовать массив для сравнения с:

 with idlist (id) as (
  values (12), (5)
)
select iddata
from idtypedata
where idtype in (select id from idlist)
group by iddata
having array_agg(idtype order by idtype) = (select array_agg(id order by id) from idlist);
  

Значение order by в array_agg() важно, потому что массив {12,5} не совпадает с {5,12}

Комментарии:

1. Большое спасибо, не знал об этом

2. @a_horse_with_no_name как бы вы использовали это для нескольких значений? Динамический SQL и подсчет разделителей в вашем предложении IN 1, чтобы получить значение count?

Ответ №2:

Используйте group by и having . Приведенный ниже запрос предоставляет вам выходные данные для всех вхождений idtype.

             select distinct iddata
            from idtypedata
            group by iddata
            having count(distinct idtype) > 1
  

пожалуйста, дайте нам знать, если у вас есть какие-либо проблемы.