0

我有一个表,其中可以有可以跨越多行的重复项。

例如,让 Employee 表与部门。

DEPTId 姓名 SALARY

1 汤姆 121

1 马克 21

1 莎莉 34

2 杰伊 342

2 布兰妮 3

3 汤姆 121

3 马克 21

3 莎莉 34

4马克21

4 莎莉 34

5 马克 21

5 莎莉 34

5 汤姆 121

5 布兰妮 3

这里当我通过DeptIdas 3 时,我需要得到DeptId1,因为 3 本质上与 1 相同。

5 与 1 不同,因为它有更多行。所有行都匹配,然后它是重复的。

我可以知道如何使用单个查询找到吗?

4

1 回答 1

0

您正在尝试比较集合内的两个集合(部门内的员工)。

基于集合的方法是在表上进行自联接,按员工匹配。下一组由两个部门组成。如果两个部门有相同的员工,那么所有员工都会匹配。也就是说,不会有一个部门的员工与另一个部门的员工不匹配的情况。

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
于 2013-02-19T17:21:35.747 回答