본문 바로가기

Oracle

Oracle - 중복된 데이터가 2개 이상일 경우

다음과 같은 데이터가 있다.

        ID        ENO NAME                
---------- ---------- --------------------
         1         10 홍길동1             
         2         10 홍길동1             
         3         20 홍길동2             
         4         20 홍길동2             
         5         20 홍길동2             
         6         30 홍길동3             
         7         30 홍길동3             
         8         40 홍길동4             
         9         50 홍길동5             
        10         50 홍길동5             

 

여기는 ENO와 NAME가 공통으로 중복되는 부분이 여러 개 있다.

이럴 경우 DISTINCT로 해도 중복된 부분은 삭제되지 않는다.

 

중복된 부분을 삭제하고 싶은데, 삭제할 부분을 우선 출력한다고 가정한다면

1. 남길 부분 출력

2. not으로 남기지 않을 부분 출력

이런 식으로 query를 짜야 한다고 느껴진다.

 

1. 남길 부분 출력

우린 가장 먼저 만들어진 데이터를 남길 생각이다.

즉, 중복되는 데이터에서 ID가 가장 작은 값(1234 순서대로 ID가 생성되니깐)을 출력하면 된다.

SELECT ENO, MIN(ID)
FROM TAB01
GROUP BY ENO;

 

각각 ENO(부서 번호)에 있는 ID의 최소값은 다음과 같이 나온다.

       ENO    MIN(ID)
---------- ----------
        30          6
        20          3
        40          8
        50          9
        10          1

 

그럼, 여기에 해당하지 않는 부분은 전부 중복된 값일 것이다.

SELECT *
    FROM TAB01
    WHERE (ENO,ID) NOT IN (SELECT ENO,MIN(ID)
                        FROM TAB01
                        GROUP BY ENO);
-- OUTPUT (중복 데이터)
        ID        ENO NAME                
---------- ---------- --------------------
         2         10 홍길동1             
         4         20 홍길동2             
         5         20 홍길동2             
         7         30 홍길동3             
        10         50 홍길동5             

 

이렇게 QUERY는 다 짰으니 삭제하면 완성!

DELETE 
FROM TAB01
    WHERE (ENO,ID) NOT IN (SELECT ENO,MIN(ID)
                        FROM TAB01
                        GROUP BY ENO);

-- OUTPUT(순수한 오리지널 홍길동 5형제만 남았다)
        ID        ENO NAME                
---------- ---------- --------------------
         1         10 홍길동1             
         3         20 홍길동2             
         6         30 홍길동3             
         8         40 홍길동4             
         9         50 홍길동5