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 

Вот когда я передать DeptId, как 3, мне нужно получить DeptId 1, а 3, по существу, такой же, как 1.

5 не совпадает с 1, как это имеет больше строк. Все строки соответствуют &, то это дубликат.

Могу ли я узнать, как найти один запрос?

+0

Проверить этот пост. http://stackoverflow.com/questions/14989297/check-whether-set-of-rows-exists-in-production Я отправил с запросом. – RVishnu

ответ

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

+0

@ RVishnu. , , Я понял. Ваше объяснение не очень хорошее. Для запроса нужны все возможные пары отделов. Затем он отфильтровывает их, исходя из того, есть ли какие-либо неуправляемые сотрудники. –