본문 바로가기
프로그래밍 언어/쿼리문 + Oracle + MySQL

[오라클] Oracle에서 key값이 없을 때 중복데이터 rowid로 제거하는 샘플 쿼리

by 우림 2016. 11. 2.

특별히 primary key가 없거나 unique index가 없어서
중복되어서는 안되는데 같은 내용의 데이터가 중복되어서 쌓여있을 경우,
1개의 row만 남기고 나머지 데이터들은 모두 삭제하고 싶다면?

이 쿼리를 수정해서 사용하면 됩니다.

ROW_NUMBER() OVER(PARTITION BY RLTM_SRNO, EQT_SRNO ORDER BY ROWID)
중복되어서는 안되는 컬럼, 즉 key가 되는 컬럼을 PARTITION BY … 부분에 넣으시면 됩니다.

데이터가 같아도 오라클 내부적으로 ROWID는 모두 다르기 때문에
ROWID를 이용하여 데이터 하나만 남기고 나머지 중복데이터는 모두 제거가 가능합니다.

DECLARE

    CURSOR cur IS
        SELECT RW
        FROM (
                    SELECT RLTM_SRNO,
                           EQT_SRNO,
                           REG_DTS,
                           ROWID AS RW,
                           ROW_NUMBER() OVER(PARTITION BY RLTM_SRNO, EQT_SRNO ORDER BY ROWID) AS RANK 
                    FROM TB_CP_RLTM_NOTC_EQT_DPLY
                    ORDER BY RLTM_SRNO,
                             EQT_SRNO,
                             REG_DTS
        )
        WHERE RANK > 1;

BEGIN
        
        
     FOR c IN cur LOOP
     
         DELETE
           FROM TB_CP_RLTM_NOTC_EQT_DPLY
         WHERE ROWID = c.RW
         ;
         
     END LOOP;
     
     
     COMMIT;
                       
END;

댓글