假设我有一个表,empgroupinfo并且我想获取仅在这两个groupId中输入的employeeid 500 and 501(将动态生成),而不应empid != 102在500个groupid中加入或多或少的组中。
empgroupinfo
500 and 501
empid != 102
我试过以下查询:
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。
empid
您的WHERE子句选择empgroupid500或501的行,而不选择empid所有empgroupids组成array的行[500, 501]。
WHERE
empgroupid
[500, 501]
您可以ARRAY_AGG在HAVING子句中使用an :
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]数组的来源,您可能不知道数组本身是否已排序。在这种情况下,“包含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];