最近做报表的优化,在一个数据量上千万条的表里面,给客户号去重复。因为这个表里面重要的东西比较多,手贱删掉了估计我就要滚蛋了,所以建了临时表,取出需要日期的数据放进去
CREATE TABLE 临时表 AS
(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
但是我删除数据的话肯定不是把所有的数据都删掉,要保留重复数据中的一条,就要使用oracle默认的一个rowid字段,只需要保留重复字段中rowid最大的一条即可
delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
这种方法适合部分重复的去重,
对于完全重复的数据,可以使用distinct查询,将结果集插入临时表,再将临时表中的替换给源表