`
qn_lf
  • 浏览: 121128 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle数据库删除重复数据的简单方法

阅读更多

 

删除重复记录:

delete from tbl where rowid not in (select min(rowid) from tbl t group by t.col1, t.col2 );

 

当数据比较多的时候,建议先对col1,col2建立索引,如下所示:

ALTER IGNORE TABLE tbl ADD UNIQUE INDEX(col1,col2);

 

因为oracle有rowid所以速度会比较快。

 

对于其他数据库如mysql,则可改成:

delete from tbl where id not in (select min(id) from tbl t group by t.col1, t.col2 );

 

----------------------------

 

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

为了陈诉方便,假设表名为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 a where 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 a where rowid < (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里如果把max换成min的话,前面的where子句中需要把"<"改为">"

 

跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。SQL语句如下:

delete from tbl where rowid not in (select max(rowid) from tbl t group by t.col1, t.col2 );

 

delete from tbl where (col1, col2) in (select col1,col2 from tbl group by col1,col2 having  count(*) > 1) and rowid  not in (select  nin(rowid) from tbl group by col1,col2 having  count(*) > 1)

还有一种方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用group by,提高效率

分享到:
评论

相关推荐

    oracle数据库各种删除重复数据方法

    oracle数据库各种删除重复数据方法

    wxh Oracle数据库删除重复记录的方法

    Oracle数据库删除重复记录的方法

    如何高效删除Oracle数据库中的重复数据

    如何高效删除Oracle数据库中的重复数据.重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证

    Oracle数据库删除表中重复记录的方法三则.txt

    Oracle数据库删除表中重复记录的方法三则.txt

    Oracle数据库学习指南

    30.删除表内重复记录的方法 31.数据库安全性策略 32.数据库的查询优化技术. 33.提高C-S系统性能的一些方法 34.提高ORACLE数据库系统import性能 35.外部联接的用法 36.性能调试的一般问题 37.优化 38...

    oracle下如何删除重复数据的几种方法

    oracle 数据库中重复的记录行的清理删除方法,总结了几种比较可行的方法路径并分析了方法的优劣

    Oracle数据库重复数据删除技术的四大优势

    重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现...Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。

    一种基于重复数据删除的Oracle数据库备份系统.pdf

    一种基于重复数据删除的Oracle数据库备份系统.pdf

    oracle删除重复数据方法

    oracle删除重复数据方法。希望对大家有用。谢谢!

    Oracle数据库实验操作

    实验62:闪回数据的查询方法,以及历史交易 137 表—存储数据的最基本单元 138 实验63:rowid的使用 138 实验64:临时表和压缩数据表的使用 141 实验65:压缩存储数据 142 实验66:删除表中指定列操作 142 实验67:...

    Oracle数据库、SQL

    1.1表是数据库中存储数据的基本单位 1 1.2数据库标准语言 1 1.3数据库(DB) 1 1.4数据库种类 1 1.5数据库中如何定义表 1 1.6 create database dbname的含义 1 1.7安装DBMS 1 1.8宏观上是数据--&gt;database 1 1.9远程...

    Oracle查询表里的重复数据方法

    一、背景  一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。 二、解决 ...Oracle删除重复数据的SQL(删除所有): 删除重复数据的基本结构写法: 想要删除这些

    oracle删除重复记录

    Oracle数据库中经常用到删除重复数据的场景,此文帮助你来删除oracle中的重复数据 只留其中一条数据。

    Oracle中查找和删除重复记录方法

    删除重复记录的方法原理:在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会...

    如何确定Oracle数据库表重复的记录

    正在看的ORACLE教程是:如何确定Oracle数据库表重复的记录。 作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一...

    删除数据库表中重复数据的总结(oracle)

    这里的重复数据指数据库中每一列的值都相同的数据,有时候也许是没有主键的原因导致数据可能重复,或者是,除了主键,其他数据重复,那么下面的方法可以都这些重复数据进行删除,保留下重复数据中的一行可以。...

    Oracle删除重复的数据,Oracle数据去重复

    Oracle 数据库中查询重复数据: select * from employee group by emp_name having count (*)&gt;1;  Oracle 查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (SELECT t2.emp_name ...

    Oracle数据库设计策略及规范.docx

    Oracle数据库设计策略及规范 设计策略及规范 1. 目的 定义Oracle数据库设计规范,作为数据库规划、设计、开发以及维护人员的技术参考资料。用以规范和指导相关人员的设计行为。 2. 概述 本文档根据Oracle数据库...

    oracle 数据库隔离级别学习

    oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...

    ORACLE查询删除重复记录三种方法

    比如现在有一人员表 (表名:peosons) 若想将姓名、身份证号、住址这三个字段完全相同的记录...几个删除重复记录的SQL语句 1.用rowid方法 2.用group by方法 3.用distinct方法 1。用rowid方法 据据oracle带的rowid属

Global site tag (gtag.js) - Google Analytics