小编典典

PostgreSQL:查询返回不正确的数据

sql

假设我有一个表,empgroupinfo并且我想获取仅在这两个groupId中输入的employeeid 500 and 501(将动态生成),而不应empid != 102在500个groupid中加入或多或少的组中。

我试过以下查询:

select empid from empgroupinfo 
where empgroupid in(500,501) and empid != 102
group by empid having count(empid) = 2

但是,以上查询还返回其他组中的empId。

empid对于员工恰好在这两个组ID(分别为500和501)和中的情况,我想获取这种情况empid != 102


阅读 248

收藏
2021-04-15

共1个答案

小编典典

您的WHERE子句选择empgroupid500或501的行,而不选择empid所有empgroupids组成array的行[500, 501]

您可以ARRAY_AGGHAVING子句中使用an :

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]数组的来源,您可能不知道数组本身是否已排序。在这种情况下,“包含AND包含于”(运算符@><@)也应该起作用。


#= 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];
2021-04-15