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';
....

现在我需要删除前两行,因为它们与前三列重复,并保留最新日期的行。

4

3 回答 3

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;

不要忘记移动索引、约束和权限...

于 2013-01-07T10:15:30.787 回答
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,name,surname) 上的索引可能会有所帮助。

于 2013-01-07T10:03:20.093 回答
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);
于 2013-01-07T10:09:27.323 回答