我在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';
....
現在我需要刪除前兩行,因爲他們通過複製前三列,並保留該行與最新的日期。
我在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';
....
現在我需要刪除前兩行,因爲他們通過複製前三列,並保留該行與最新的日期。
如果真的有很多重複的,我會建議重建表只用乾淨的數據:
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;
不要忘記移動索引,約束和特權...
我會把同樣的要求放到OP上:將「lots」定義爲表格中所有行的百分比。 – APC
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,姓名,姓氏)上的索引可能會有所幫助。
如果可能的話,我會去一個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);
[刪除基於最大日期/時間的Oracle中的重複記錄]的可能重複(http://stackoverflow.com/questions/4194908/deleting-基於oracle-based-maximum-date-time的重複記錄) –
將「lots」定義爲表中所有行的perecentage。 – APC