#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
пожалуйста, дайте нам знать, если у вас есть какие-либо проблемы.