Postgresql:查询返回错误数据

时间:2017-05-08 11:19:15

标签: sql postgresql relational-division

假设我有一个表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

1 个答案:

答案 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