您正在尝试比较集合内的两个集合(部门内的员工)。
基于集合的方法是在表上进行自联接,按员工匹配。下一组由两个部门组成。如果两个部门有相同的员工,那么所有员工都会匹配。也就是说,不会有一个部门的员工与另一个部门的员工不匹配的情况。
该having
子句测试这种情况。
此版本的查询使用驱动程序表将部门与员工匹配。当集合不匹配时,完整的外连接将有一个不匹配的行,它在having
子句中被选中:
select driver.deptid1, driver.deptid2
from (select d1.deptid as deptid1, d2.deptid as deptid2
from (select distinct deptid from employees) d1 cross join
(select distinct deptid from employees) d2
) driver left outer join
employees e1
on e1.deptid = driver.deptid full outer join
employees e2
on driver.deptid2 = e2.deptid and e1.name = e2.name and e1.salary = e2.salary
group by driver.deptid1, driver.deptid2
having SUM(case when e1.name is null then 1 else 0 end) = 0 and
SUM(case when e2.name is null then 1 else 0 end) = 0