2013-02-19 82 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 

在這裏,當我通過DeptId爲3,我需要得到DeptId 1,爲3本質上是一樣的1

5不一樣1,因爲它有更多的行。所有的行匹配&然後它是重複的。

我可以知道如何才能找到使用單個查詢?

+0

檢查這個職位。 http://stackoverflow.com/questions/14989297/check-whether-set-of-rows-exists-in-production 我已經發布與查詢。 – RVishnu 2013-04-09 19:12:20

回答

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

以上查詢不起作用。我不明白爲什麼我們需要SUM中的條款。它似乎沒有做任何事情。 – RVishnu 2013-02-19 19:52:56

+0

@RVishnu。 。 。我知道了。你的解釋不是很好。查詢需要駕駛臺來獲取所有可能的部門對。然後根據是否有任何不匹配的員工進行篩選。 – 2013-02-19 20:17:57