暂无图片
Oracle如何删除大表的重复记录
我来答
分享
刘广
2021-12-01
Oracle如何删除大表的重复记录
暂无图片 5M

场景:假设有一张表EMP,表数据量有两千万,ID和NAME都有唯一索引

需求:找出表中的重复数据,并删除重复的数据,但是要保留时间最新的那一条记录,表结构如下:



比如,上表中SCOTT的ID和NAME都重复了,我想删除重复的行,但是我要保留最新的记录,最新的记录即2021/10/30 18:00:00分的,请问大家有什么好的办法?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
DarkAthena

这个当然是用开窗函数结合rowid定位记录更快,这样就只要根据rowid删数据就好了。

create table temp_rd as

select rd from (

select rowid rd,row_number() over(partition by id,name order by updatetime desc) rn from emp ) where rn=1;

delete emp a where not exists (select 1 from temp_rd b where a.rowid=b.rd);


两千万对oracle来说真不算大表,而且你那唯一索引怕不是失效了吧,如果是有效的唯一索引,是不会出现重复记录的

暂无图片 评论
暂无图片 有用 0
暂无图片
刘广
题主
2021-12-02
谢谢专家,我用的也是这个方案
薛晓刚

1、请问你都是唯一索引的约束,这种是怎么出来的?理论上不应该啊

2、select id,name,max(updatetime) from t  group  by   id,name 这是找出最新的。如果是最旧的就是min

3、然后你再嵌套一层获得到id,进行删除或者是迁移到一个新表。

暂无图片 评论
暂无图片 有用 0
刘广
题主
2021-12-02
谢谢
Thomas

可参考我写的这篇:https://www.modb.pro/db/162057

暂无图片 评论
暂无图片 有用 0
刘广
题主
2021-12-02
谢谢
zhuzhijiao

利用 rowid 查询/ 删除表中重复行。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏