ORACLE中怎么批量删除无主键重复数据
发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,这篇文章给大家介绍ORACLE中怎么批量删除无主键重复数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.需求说明TEST表情况说明:按月进行分区的分区表未定义主键或唯一索引包
千家信息网最后更新 2024年10月02日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安全错误
数据库的锁怎样保障安全
高校网络安全配置命令
易语言对接sql数据库
我的世界服务器禁用
网络安全宣传团课总结
数据库分类管理
黑客攻击服务器犯法
DELL 服务器启动按哪个键
人人爱家网络技术有限公司
联众游戏服务器
网站项目数据安全数据库处理
杭州计算机软件开发大概要多少钱
网络安全的警察好
软件开发外包公司利润率
itv网络安全密钥
当前与服务器连接
花旗软件开发有前途吗
金山区提供软件开发质量保障
数据库软件使用会增加数据吗
泰恒软件开发
上海卓妍网络技术有限公司
股票配资软件开发网
中华人民共和国网络安全手抄报
峰迢电机驱动软件开发
怎么选择香港云服务器供应商
服务器直接连接双防火墙
网络安全主题创意绘画内容
中文数据库是干什么的
重庆城口网上生鲜软件开发
lol韩服是哪个服务器
部队手机网络安全自查