假设我有一个表empgroupinfo
,并且我想获取那个完全属于这两个groupId 500 and 501
(将动态出现)的employeeid,不应该有更多或更少数量的组,其中empid != 102
位于500 groupid中。
我尝试过以下查询:
select empid from empgroupinfo
where empgroupid in(500,501) and empid != 102
group by empid having count(empid) = 2
但是上面的查询也会返回其他组中的empId。
我希望在员工完全属于这两个groupids(500和501)和empid
的情况下获取empid != 102
。
答案 0 :(得分:1)
您的WHERE
子句选择empgroupid
为500或501的行,而不是empid
s所有empgroupid
形成数组[500, 501]
的行。< / p>
您可以在ARRAY_AGG
子句中使用HAVING
:
SELECT empid
FROM empgroupinfo
GROUP BY empid
-- ORDER BY clause here is important, as array equality checks elements position by position, not just 'same elements as'
HAVING ARRAY_AGG(DISTINCT empgroupid ORDER BY empgroupid) = ARRAY[500, 501]
根据[500, 501]
数组的来源,您可能不知道它本身是否已排序。在这种情况下,&#34;包含AND包含在&#34; (运营商@>
和<@
)也应该有用。
#= CREATE TABLE empgroupinfo (empid int, empgroupid int);
CREATE TABLE
Time: 10,765 ms
#= INSERT INTO empgroupinfo VALUES (1, 500), (1, 501), (2, 500), (2, 501), (2, 502);
INSERT 0 5
Time: 1,451 ms
#= SELECT empid
FROM empgroupinfo
GROUP BY empid
HAVING ARRAY_AGG(empgroupid ORDER BY empgroupid) = ARRAY[500, 501];
┌───────┐
│ empid │
├───────┤
│ 1 │
└───────┘
(1 row)
Time: 0,468 ms