oracle-快速删除重复的记录

鬱悶的很!

DBA要建個PK建不起來就讓我來做,理由是:要處理的Table是我用的系統用到的, 甚麼邏輯哦,在想生產線的人天天輸資料到數據庫,那是不是也要找他們維護相關的Table,有點不爽,可還是做了,做完後告訴DBA,一聲謝謝都沒有......

下面是參考過的文檔

[@more@]

Select *, count(*) as 重複次數
from table
group by A,B,C,D
having count(*)>1

表T结构如下
  
  COL1
  
  中有重复记录(COL1,COL2为主键),如何删除
  
  1、有少数重复记录(在col1,col2上有索引比较好)
  
  DELETE T
  WHERE (COL1,COL2) IN
  (SELECT COL1,COL2 FROM T GROUP BY COL1,COL2 HAVING COUNT(*) > 1)
  AND
  ROWID NOT IN
  (SELECT MIN(ROWID) FROM T GROUP BY COL1,COL2 HAVING COUNT(*) > 1)
  
  2、大部份记录有重复记录
  
  DELETE T WHERE ROWID NOT IN
  (SELECT MIN(ROWID) FROM T GROUP BY COL1,COL2)
  
  3、其他写法
  
  DELETE T WHERE ROWID IN
  (SELECT A.ROWID FROM T A,T B
  WHERE A.COL1=B.COL1 AND A.COL2 = B.COL2 AND A.ROWID > B.ROWID)
  
  ######################################
  
  10. 删除重复记录
  
  最高效的删除重复记录方法 ( 因为使用了ROWID)
  
  DELETE FROM EMP E
  
  WHERE E.ROWID > (SELECT MIN(X.ROWID)
  
  FROM EMP X
  
  WHERE X.EMP_NO = E.EMP_NO);
  
  11. 用TRUNCATE替代DELETE
  
  当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是
  
  恢复到执行删除命令之前的状况)
  
  而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
  
  (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
  
  12. 尽量多使用COMMIT
  
  只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
  
  COMMIT所释放的资源:
  
  a. 回滚段上用于恢复数据的信息.
  
  b. 被程序语句获得的锁
  
  c. redo log buffer 中的空间
  
  d. ORACLE为管理上述3种资源中的内部花费
  
  (译者按: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/202861/viewspace-885832/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/202861/viewspace-885832/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值