选择符合其他行条件的行

时间:2020-10-21 10:36:04

标签: postgresql group-by

我有一个表,可以为用户存储一些数据:

| user | a | b |
|------|---|---|

此表的主键由三列PRIMARY KEY (user, a, b)

组成

请参见SQLFiddle


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

第一个解决方案

select usr
from user_data
where (a, b) in (
    (values ('a', 'b'), ('a', 'd'))
)
group by usr
having COUNT(1) = 2;

但是我觉得这个解决方案很棘手。由于having clause起作用,我感到多余,因为必须指定匹配的确切行数。

第二个解决方案

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))]

感觉更具可读性,但仍然很冗长且性能较低。


我正在寻找一个替代查询,而不将诸如@>之类的数组操作作为第二查询,这与第一种解决方案相似。可以用另一种方式做吗?

0 个答案:

没有答案