'중복삭제'에 해당되는 글 2건

  1. 2014.07.24 중복삭제하기
  2. 2004.10.15 중복된 RECORD 삭제 방법
posted by 구름너머 2014. 7. 24. 10:37

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
posted by 구름너머 2004. 10. 15. 09:48

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가 다른 자료를 삭제하되   최그것을 살리고 이전것을 삭제하는 경우입니다.