美国上市公司,专注Java培训21年

Oracle如何删除表中重复记录


如何删除表中重复记录

在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢?

平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。

java培训班分享处理过程

重复的数据可能有这样两种情况:第一种是表中只有某些字段一样,第二种是两行记录完全一样。删除重复记录后的结果也分为2种,第一种是重复的记录全部删除,第二种是重复的记录中只保留最新的一条记录,一般业务中第二种的情况较多。

2.1 删除重复记录的方法原理

(1)在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。

(2)在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。

2.2 删除部分字段重复数据

2.2.1 重复记录全部删除

想要删除部分字段重复的数据,可以使用下面语句进行删除,下面的语句是删除表中字段1和字段2重复的数据:

DELETE FROM 表名 a

WHERE (字段1, 字段2)

IN (SELECT 字段1,字段2

FROM 表名

GROUP BY 字段1,

字段2

HAVING COUNT(1) > 1)

;

上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以建议先将查询到的重复的数据插入到一个临时表中,然后进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:

CREATE TABLE 临时表 AS (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1);

上面这句话就是建立了临时表,并将查询到的数据插入其中。下面就可以进行这样的删除操作了:

delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

例子

如何删除表中重复记录

DELETE FROM tmp_lhr t

WHERE (t.accesscode, t.lastserviceordercode, t.serviceinstancecode) IN

(SELECT a.accesscode, a.lastserviceordercode, a.serviceinstancecode

FROM tmp_lhr a

GROUP BY a.accesscode,

a.lastserviceordercode,

a.serviceinstancecode

HAVING COUNT(1) > 1);

2.2.2 保留最新的一条记录

假如想保留重复数据中最新的一条记录啊!那怎么办呢?在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。

如何查找重复记录?

SELECT *

FROM TABLE_NAME A

WHERE ROWID NOT IN (SELECT MAX(ROWID)

FROM TABLE_NAME D

WHERE A.COL1 = D.COL1

AND A.COL2 = D.COL2);

如何删除重复记录?

1、 方法1

DELETE FROM TABLE_NAME

WHERE ROWID NOT IN (SELECT MAX(ROWID)

FROM TABLE_NAME D

group by d.col1,d.col2);

这种方法最简单!!!

2、 方法2

DELETE FROM TABLE_NAME A

WHERE ROWID NOT IN (SELECT MAX(ROWID)

FROM TABLE_NAME D

WHERE A.COL1 = D.COL1

AND A.COL2 = D.COL2);

3、 方法3 临时表

由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

create table 临时表 as select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;

DELETE FROM 正式表 a

where a.rowid NOT IN (SELECT b.dataid

FROM 临时表 b


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • Oracle体系结构-Java培训机构整理分享
    Oracle体系结构-Java培训机构整理分享
    Oracle体系结构-Java培训机构整理分享 详情>>

    2017-01-04

  • Oracle数据库碎片的整理方法-java培训机构
    Oracle数据库碎片的整理方法-java培训机构
    Oracle数据库碎片的整理方法-java培训机构 详情>>

    2016-12-29

  • Oracle如何删除表中重复记录
    Oracle如何删除表中重复记录
    在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢? 详情>>

    2016-12-14

  • java培训班分享:Oracle应该掌握的9个免费工具
    java培训班分享:Oracle应该掌握的9个免费工具
    马上要年底了,2016年的你又收获了多少Oracle知识呢?不想有浮躁还是脚踏实地的学点安身立命的技能比较实在。今天把我以往用过的免费工具分享给大家,欢迎分享。 详情>>

    2016-12-02

  • Java开班时间

    收起