Oracle Technical Bulletins No. 10185 참고..
중복된 RECORD 삭제 방법
================================
중복된 RECORD를 삭제하는 방법은 2가지가 있습니다.
방법1)
SQL> CREATE TABLE emp2 AS SELECT distinct * FROM emp;
SQL> DROP TABLE emp;
SQL> RENAME emp2 TO emp;
방법2) 중복된 데이터중에서 ROWID가 큰 값을 제거
SQL> DELETE FROM emp a
WHERE rowid > (SELECT MIN(ROWID)
FROM emp b
WHERE b.empno = a.empno);
en-core에서 본 白面書生(www.okjsp.pe.kr)님의 글도 참고해서 넣었습니다.
방법3) 나중에 들어온 데이터를 살릴경우
SQL> DELETE FROM emp a
WHERE ROWID < (SELECT MAX(ROWID)
FROM emp b
WHERE a.empno = b.empno);
방법4) 레코드가 완전 중복이 아니고 일부 중복인 데이터를 삭제할 경우
SQL>
DELETE /*+ FULL(A) PARALLEL(A, 7) */
FROM TB_TEST PARTITION(P201407) A
WHERE ROWID IN ( SELECT RID
FROM ( SELECT ROWID AS RID, AREA_NO, KUK_NO, SUB_NO,
RANK() OVER (PARTITION BY AREA_NO, KUK_NO, SUB_NO ORDER BY START_DATE DESC) AS R_NO
FROM TB_TEST PARTITION(P201407) B
WHERE END_DATE = '99991231'
AND START_DATE < '20140701'
)
WHERE R_NO <> 1
)
;
설명: 테이블 TB_TEST에서 AREA_NO, KUK_NO, SUB_NO, END_DATE 가 동일하고
START_DATE가 7월이전인 자료 중에서 START_DATE가 OLD인 자료를 삭제한다.
즉, AREA_NO, KUK_NO, SUB_NO, END_DATE는 같으나 START_DATE가 다른 자료를 삭제하되 최그것을 살리고 이전것을 삭제하는 경우입니다.
'ORACLE' 카테고리의 다른 글
오라클 파라메터 조회 (0) | 2013.12.28 |
---|---|
rawtohex 와 chr 사용 (0) | 2013.12.20 |
connect by [Oracle 9i 에서 10g CONNECT_BY_ROOT 써먹기] (0) | 2013.04.04 |
LTRIM의 재발견 (0) | 2013.04.04 |
28일 수업 (0) | 2013.03.28 |