2013-02-19 2 views
0

여러 행에 걸쳐있을 수있는 중복이있을 수있는 테이블이 있습니다.DB2에서 다중 행 중복 찾기

예를 들어 부서가있는 직원 테이블을 만들 수 있습니다. 여기

 
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 

은 내가 더 행이없는 동일 하나로서

5는 본질적으로 동일한 1로 3이기 때문에 DeptId 1을 얻을 필요는 DeptId 3으로 통과 할 때. 모든 행은 &과 일치하며 중복됩니다.

단일 쿼리를 사용하여 어떻게 찾을 수 있습니까?

+0

확인이 게시물 : 세트가 일치하지 않는 경우, 조인 완전 외부는 having 절에 포착 된 불일치의 행을해야합니다. http://stackoverflow.com/questions/14989297/check-whether-set-of-rows-exists-in-production은 나는 쿼리를 게시했다. – RVishnu

답변

0

집합 내의 두 세트 (부서 내의 직원)를 비교하려고합니다.

집합 기반 접근 방식은 직원이 일치하는 테이블에서 자체 조인을 수행하는 것입니다. 두 부서의 다음 그룹. 두 부서의 직원이 같을 경우 모든 직원이 일치합니다. 즉, 한 부서의 직원이 다른 부서의 직원과 일치하지 않는 경우는 없습니다.

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 
+0

위의 쿼리가 작동하지 않습니다. 나는 왜 having 절에 SUM이 필요한지 이해하지 못합니다. 아무것도하지 않는 것 같습니다. – RVishnu

+0

@RVishnu. . . 알았다. 당신의 설명은별로 좋지 않습니다. 가능한 모든 쌍의 부서를 확보하려면 쿼리에 운전 표가 필요합니다. 그런 다음 불일치하는 직원이 있는지 여부에 따라 필터링합니다. –