2013-01-07 43 views
0

我在Oracle 8,1中有數據表。大約有一百萬行。但是很多行由相同的列重複。我需要知道清除這些數據的最快方法。 比如我有:如何在oracle中清除表

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-基於oracle-based-maximum-date-time的重複記錄) –

+1

將「lots」定義爲表中所有行的perecentage。 – 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) 

這是多快取決於你的Oracle參數。並且(id,姓名,姓氏)上的索引可能會有所幫助。

1

如果可能的話,我會去一個CTAS(CREATE TABLE AS選擇),截斷原始表,並將數據複製回:

-- 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);