SQL*Plus

중복된 레코드 삭제방법

OEasy 2006. 10. 26. 13:06
BULLETIN CATEGORY
BULLETIN TOPIC
: SQL*PLUS 
: 중복된 레코드 삭제방법

  테이블에 저장된 중복된 레코드를 삭제하는 방법으로 ROWID를 이용할 수 있다. 테이블의 레코드는 각 ROW들의 물리적인 주소에 해당하는 유일한 ROWID를 가지고 있으며, 이 ROWID는 데이타베이스 내부적으로 PSEUDOCOLUMN에 해당되며, 다음과 같은 형태로 구성되어 있다.   

SQL > SELECT ROWID, ENAME FROM EMP;   

ROWID            ENAME   
-------------------    ---------   
00000DD5.0000.0001     SMITH   
00000DD5.0001.0001     ALLEN   
00000DD5.0002.0001     WARD   

위의 예 처럼 ROWID는 ROW를 포함하는 데이타 블럭, ROW를 포함하는 블럭내의 ROW와 ROW를 포함하는 데이타 화일등이 3부분으로 구분되며, HEXADECIMAL로 표현된다.   
이러한 ROW의 물리적인 주소에 해당하는 유일한 값을 갖는 ROWID를 이용하여 다음과 같은 SQL문을 구성할 수 있다:   

1) [EMP]테이블을 2개의 DUMMY 테이블로 구성한다.   
  - EMP E, EMP X   

2) SUB-QUERY에서 [SELECT]문을 통하여 2 테이블에서 동일한 값을 갖는   
   ROW들 중에서 MINIUM ROWID를 테이블 EMP X로 부터 찾는다.   

3) [DELETE]문에서 SUB-QUERY의 MINIUM ROWID보다 큰 ROWID를 삭제한다.   

SQL > DELETE FROM EMP E   
      WHERE E.ROWID > ( SELECT MIN(X.ROWID)   
               FROM EMP X   
                WHERE X.EMPNO = E.EMPNO );    


Oracle Korea Customer Support Technical Bulletins