2013-01-07 3 views
0

Oracle 8.1에 데이터 테이블이 있습니다. 약 백만 줄이 있습니다. 그러나 많은 행이 동일한 열에 의해 중복됩니다. 이 데이터를 지우는 가장 빠른 방법을 알아야합니다.오라클 테이블 정리 방법

id name surname date 
21 'john' 'smith' '2012 12 12'; 
21 'john' 'smith' '2012 12 13'; 
21 'john' 'smith' '2012 12 14'; 
.... 

을 그리고 지금 나는 그들이 처음 세 개의 기둥에 의해 복제로 처음 두 행을 삭제하고 최신 날짜 행을 유지해야합니다 예를 들어 내가있다.

+0

[최대 날짜/시간을 기준으로 Oracle에서 중복 레코드 삭제] (http://stackoverflow.com/questions/4194908/deleting- 최대 시간 기준 오라클 기반의 중복 레코드) –

+1

"lots"를 테이블의 모든 행의 비율로 정의하십시오. – APC

답변

2

를, 내가 좋겠

CREATE TABLE tmp AS 
SELECT id, name, surname, max(d) as d 
    FROM t 
    GROUP BY id, name, surname; 

를 다음 원래 테이블과 원본 테이블을 대체 : 오직 깨끗한 데이터 테이블을 재 작성하는 것이 좋습니다

RENAME your_table TO old_table; 
RENAME tmp_table TO your_table; 
,

인덱스, 제약 조건 및 권한을 이동하는 것을 잊지 마세요 ...

+1

OP에 올린 것과 동일한 요청을 당신에게 보냅니다 : "lots"를 테이블의 모든 행의 비율로 정의하십시오. – APC

1
delete from table t where 
exists (select * from table where id=t.id and name=t.name and surname=t.surname 
     and date > t.date) 

얼마나 빠르지는 오라클 매개 변수에 달려 있습니다. 그리고 (id, name, surname)에 대한 색인이 도움이 될 수 있습니다.

1

가능하다면, 나는, (같은 선택 테이블을 생성)을 CTAS에 갈 원래의 테이블을 절단하고, 다시 데이터를 복사 할 것 : 중복이 정말 많이가있는 경우

-- create the temp table (it contains only the latest values for a given (id, name, surname) triple 
CREATE TABLE tmp as 
SELECT id, name, surname, date1 from 
(select 
    t1.*, 
    row_number() over (partition by id, name, surname order by date1 desc) rn 
from mytab t1) 
where rn = 1; 

-- clear the original table 
TRUNCATE TABLE mytab; 

-- copy the data back 
INSERT /* +APPEND */ INTO mytab(id,name,surname,date1) 
    (SELECT id,name,surname,date1 from tmp);