oracle快速删除重复的记录

 更新时间:2007年03月07日 00:00:00   作者:  
正在看的ORACLE教程是:oracle快速删除重复的记录。做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统。也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉。

对此,总结了一下删除重复记录的方法,以及每种方法的优缺点。

为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引。

1、通过创建临时表

可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:

creat table tbl_tmp (select distinct* from tbl);truncate table tbl;//清空表记录insert into tbl select * from tbl_tmp;//将临时表中的数据插回来。 
这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

2、利用rowid

在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:

delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2) 
如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。

3、利用max或min函数

这里也要使用rowid,与上面不同的是结合max或min函数来实现。SQL语句如下

delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里max使用min也可以 
或者用下面的语句

delete from tbl awhere rowid<(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里如果把max换成min的话,前面的where子句中需要把"<"改为">" 
跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。SQL语句如下:

deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) >1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) >1) 
还有一种方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用group by,提高效率 

相关文章

  • Linux下Oracle删除用户和表空间的方法

    Linux下Oracle删除用户和表空间的方法

    这篇文章主要介绍了Linux下Oracle删除用户和表空间的方法,涉及Oracle数据库用户和表操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • Linux中Oracle启动侦听报错TNS:permission denied的解决方法

    Linux中Oracle启动侦听报错TNS:permission denied的解决方法

    这篇文章主要介绍了Linux中Oracle启动侦听时报错TNS:permission denied的解决方法,文中给出了详细的解决方法,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • ORACLE错误一览表 方便查询

    ORACLE错误一览表 方便查询

    这篇文章主要介绍了ORACLE错误一览表 方便查询,需要的朋友可以参考下
    2015-12-12
  • Oracle中使用Rownum分页详细例子

    Oracle中使用Rownum分页详细例子

    这篇文章主要介绍了Oracle中使用Rownum分页详细例子,本文将分别展示使用rownum伪列和row_number()分析函数来完成Oracle数据分页操作的具体使用方法,需要的朋友可以参考下
    2014-07-07
  • 深入浅析Orcale的nvl函数和SQL Server的isnull函数

    深入浅析Orcale的nvl函数和SQL Server的isnull函数

    这篇文章主要介绍了Orcale的nvl函数和SQL Server的isnull函数的相关资料,需要的朋友可以参考下
    2017-10-10
  • Oracle 数据库导出(exp)导入(imp)说明

    Oracle 数据库导出(exp)导入(imp)说明

    exp 将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移。
    2009-02-02
  • [Oracle] CPU/PSU补丁安装详细教程

    [Oracle] CPU/PSU补丁安装详细教程

    Oracle CPU的全称是Critical Patch Update, Oracle对于其产品每个季度发行一次安全补丁包,通常是为了修复产品中的安全隐患,以下是对CPU/PSU补丁安装的具体操作步骤进行了详细的分析介绍,需要的朋友可以参考
    2013-07-07
  • Oracle中sys和system的区别小结

    Oracle中sys和system的区别小结

    SYS用户具有DBA权限,并且拥有SYS模式,只能通过SYSDBA登陆数据库。是Oracle数据库中权限最高的帐号 SYSTEM具有DBA权限。但没有SYSDBA权限。平常一般用该帐号管理数据库就可以了。
    2009-11-11
  • Oracle实现分页查询的SQL语法汇总

    Oracle实现分页查询的SQL语法汇总

    这篇文章主要介绍了Oracle实现分页查询的SQL语法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • Oracle 监控索引使用率脚本分享

    Oracle 监控索引使用率脚本分享

    这篇文章主要介绍了Oracle 监控索引使用率脚本分享,本文给出的脚本将得到索引的使用率,可以很好的度量索引的使用情况以及根据这个值来判断当前的这些索引是否可以被移除或改进,需要的朋友可以参考下
    2014-09-09

最新评论