ORACLE中怎么批量删除无主键重复数据
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章给大家介绍ORACLE中怎么批量删除无主键重复数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.需求说明TEST表情况说明:按月进行分区的分区表未定义主键或唯一索引包
千家信息网最后更新 2025年01月21日ORACLE中怎么批量删除无主键重复数据
这篇文章给大家介绍ORACLE中怎么批量删除无主键重复数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
1.需求说明
TEST表情况说明:
按月进行分区的分区表
未定义主键或唯一索引
包含COL1,COL2,COL3,INSERTTIME四列
现需要删除2019年3月31日当天存在的重复数据
2.解决方法
2.1 确认无重复数据的记录数
SELECT COUNT(1) FROM ( SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01' GROUP BY COL1,COL2,COL3);
2.2 梳理需要筛选的数据
由于原表A数据量特别大,此处新建一张表将需要处理的数据单独存放
CREATE TABLE TEST_TMP NOLOGGING ASSELECT /*PARALLEL +8 */ A.*,A.ROWID ROWID_OLD FROM TEST PARTITION(P201903) A WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01';
2.2 确认需要删除的数据
理论上而言需要删除和需要保留的数据记录数应相等
--需要删除的数据记录数 SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID IN ( SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01' GROUP BY COL1,COL2,COL3,INSERTTIME HAVING COUNT(1) > 1)AND INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'--需要保留的数据记录数 SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID NOT IN ( SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01' GROUP BY COL1,COL2,COL3,INSERTTIME HAVING COUNT(1) > 1)AND INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
2.3 利用分批提交删除重复数据
DECLARE TYPE ROWID_LIST IS TABLE OF UROWID INDEX BY BINARY_INTEGER; ROWID_INFOS ROWID_LIST; I NUMBER; CURSOR C_ROWIDS IS (SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01' GROUP BY COL1,COL2,COL3,INSERTTIME HAVING COUNT(1) > 1); BEGIN OPEN C_ROWIDS; LOOP --此处LIMIT后的值为分批提交的记录数,可以根据实际情况调整 FETCH C_ROWIDS BULK COLLECT INTO ROWID_INFOS LIMIT 10000; FORALL I IN 1..ROWID_INFOS.COUNT --如下的DELETE语句为分批提交实际需要执行的部分 DELETE FROM TEST WHERE ROWID=ROWID_INFOS(I); COMMIT; EXIT WHEN ROWID_INFOS.COUNT<10000; END LOOP; CLOSE C_ROWIDS; END;
2.4 确认无重复数据
SELECT * FROM ( SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01' GROUP BY COL1,COL2,COL3,INSERTTIME HAVING COUNT(1)>1 ));
关于ORACLE中怎么批量删除无主键重复数据就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
数据
内容
实际
情况
更多
帮助
不错
兴趣
小伙
小伙伴
文章
方法
理论
知识
篇文章
索引
语句
部分
需求
分区表
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
GT7 无法与服务器
网络安全教育的日记怎么写
新能源项目软件开发
网络技术员招聘信息
长沙乐推网络技术服务
网络安全最著名的人物
网络安全和信息化建设专项审计
手机软件开发软件开发
博途新建opc服务器
新浪潮服务器默认密码
mc起床战争服务器
云服务器租用价格比较
天猫怎么看数据库
计算机网络技术5g方向教程
贱圣爆服务器
安徽通信软件开发标准
判断数据库唯一性
全球网络安全报告
社会服务器
驻留在web服务器上的功能
网络安全平台暂停注册
数据库的安全性包含哪些方面
湖北数据库空投箱销售
服务器硬件加密
网络安全行业主管部门是什么
竹山专业软件开发市场
采购需求数据库开发
软件开发定制需要多少钱
网络安全防范意识论文
怎样做服务器才不会收费