Postgresql 选择与其他行中的条件匹配的行

Postgresql 选择与其他行中的条件匹配的行,postgresql,group-by,Postgresql,Group By,我有一个为用户存储一些数据的表: | user | a | b | |------|---|---| 此表的主键包含在三列主键(用户、a、b) 看 我希望得到至少包含给定(a,b)对的用户。事实上,我找到了两种解决方案: 第一个解决方案 select usr from user_data where (a, b) in ( (values ('a', 'b'), ('a', 'd')) ) group by usr having COUNT(1) = 2; with ud as (

我有一个为用户存储一些数据的表:

| user | a | b |
|------|---|---|
此表的主键包含在三列
主键(用户、a、b)


我希望得到至少包含给定(a,b)对的用户。事实上,我找到了两种解决方案:

第一个解决方案

select usr
from user_data
where (a, b) in (
    (values ('a', 'b'), ('a', 'd'))
)
group by usr
having COUNT(1) = 2;
with ud as (
    select usr, array_agg((a, b)) AS data
    from user_data
    group by usr
)
select usr from ud
where data @> array[('a'::character varying(100), 'b'::character varying(100)), ('a'::character varying(100), 'd'::character varying(100))]
但我觉得这个解决方案很难。它之所以有效,是因为
having子句
,我觉得必须指定匹配的精确行数是多余的

第二种解决方案

select usr
from user_data
where (a, b) in (
    (values ('a', 'b'), ('a', 'd'))
)
group by usr
having COUNT(1) = 2;
with ud as (
    select usr, array_agg((a, b)) AS data
    from user_data
    group by usr
)
select usr from ud
where data @> array[('a'::character varying(100), 'b'::character varying(100)), ('a'::character varying(100), 'd'::character varying(100))]
感觉更具可读性,但仍然相当冗长,性能较差


我正在寻找一个不涉及数组操作的替代查询,例如
@>
作为第二个查询,类似于第一个解决方案。有可能用另一种方法吗