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))]
感觉更具可读性,但仍然相当冗长,性能较差
我正在寻找一个不涉及数组操作的替代查询,例如@>
作为第二个查询,类似于第一个解决方案。有可能用另一种方法吗