我在 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';
....
现在我需要删除前两行,因为它们与前三列重复,并保留最新日期的行。
我在 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';
....
现在我需要删除前两行,因为它们与前三列重复,并保留最新日期的行。
如果确实有很多重复项,我建议仅使用干净数据重新创建表:
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;
不要忘记移动索引、约束和权限...
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) 上的索引可能会有所帮助。
如果可能的话,我会选择 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);