我有一个表,可以为用户存储一些数据:
| 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))]
感觉更具可读性,但仍然很冗长且性能较低。
我正在寻找一个替代查询,而不将诸如@>
之类的数组操作作为第二查询,这与第一种解决方案相似。可以用另一种方式做吗?