我有一个表可以存在可以跨越多行的重复项。
例如,让Employee表与department。
DEPTId Name SALARY 1 TOM 121 1 MARK 21 1 SALLIE 34 2 JAY 342 2 BRITNEY 3 3 TOM 121 3 MARK 21 3 SALLIE 34 4 MARK 21 4 SALLIE 34 5 MARK 21 5 SALLIE 34 5 TOM 121 5 BRITNEY 3
当我将DeptId
传递为3时,我需要获得DeptId
1,因为3基本上与1相同。
5与1不同,因为它有更多行。所有行匹配&那是重复的。
我可以知道如何使用单个查询找到它吗?
答案 0 :(得分: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