iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle如何删除表中重复记录
  • 177
分享到

Oracle如何删除表中重复记录

oracle如何删除 2022-11-30 23:11:37 177人浏览 八月长安
摘要

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

Oracle如何删除表中重复记录

1    引言

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

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

2    处理过程

重复的数据可能有这样两种情况 : 第一种 是 表中只有某些字段一样,第二种是两行记录完全一样 。删除重复记录后的结果也分为 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  临时表 );

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

例子:

Oracle如何删除表中重复记录  

   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 );

Oracle如何删除表中重复记录  

 

2.2.2   保留最新的一条记录

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

一、   如何查找重复记录?

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

                       WHERE   a.字段1  =  b.字段1

    and  a.字段2  =  b.字段2 );

commit ;

 

例子:

   DELETE   FROM  tmp_lhr t

   WHERE   t.rowid  not   in   ( SELECT   MAX ( ROWID )

                      FROM    tmp_lhr a

                      GROUP    BY  a.accesscode ,

                               a.lastserviceordercode ,

                               a.serviceinstancecode );

Oracle如何删除表中重复记录  

 

  DELETE   FROM  tmp_lhr t

  WHERE   t.rowid  !=

         ( SELECT   MAX ( ROWID )

          FROM    tmp_lhr a

          WHERE   a.accesscode  =  t.accesscode

          AND     a.lastserviceordercode  =  t.lastserviceordercode

          AND     a.serviceinstancecode  =  t.serviceinstancecode );

Oracle如何删除表中重复记录  

 

2.2.3   删除以某个字段为准的记录

  ----任意保留一条记录

DELETE   FROM  ods_entity_info_full_lhr_01 T

WHERE   T.ROWID  NOT   IN   ( SELECT   MAX ( A.ROWID )

                        FROM    ods_entity_info_full_lhr_01 A

                        GROUP    BY  entity_code ,

                                 entity_type );  

         ---保留 entity_id 最大的一条记录

         DELETE   FROM  ods_entity_info_full_lhr_01 a

         WHERE   a.rowid  NOT   IN

                ( SELECT  t.rowid

                 FROM    ods_entity_info_full_lhr_01 t

                 WHERE    ( t.entity_code ,  t.entity_type ,  t.entity_id )   IN

                        ( SELECT  entity_code ,

                               entity_type ,

                                MAX ( entity_id )

                         FROM    ods_entity_info_full_lhr_01

                         GROUP    BY  entity_code ,

                                  entity_type ));

2.3    删除完全重复记录

对于表中两行记录完全一样的情况,可以用下面 三种方式 获取到去掉重复数据后的记录:

1.   select   distinct   *   from  表名 ;

2.   select * from  表名  group by  列名 1, 列名 2,... having count(*)>1

3.   select * from   表名  a where rowid<(select max(rowid) from  表名  b where a. 列名 1=b. 列名 2 and ...)

2.3.1   方法 1

   DELETE   FROM  tmp_lhr t

   WHERE   t.rowid  not   in   ( SELECT   MAX ( ROWID )

                      FROM    tmp_lhr a

                      GROUP    BY  a.accesscode ,

                               a.lastserviceordercode ,

                               a.serviceinstancecode );

2.3.2   方法 2

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATE   TABLE  临时表  AS   ( select   distinct   *   from  表名 );

truncate   table  正式表 ;

insert   into  正式表  ( select   *   from  临时表 );

drop   table  临时表 ;

 

2.3.3   方法 3

DELETE   FROM  xr_maintainsite E

WHERE   E.ROWID  >   ( SELECT   MIN ( X.ROWID )

                   FROM    xr_maintainsite X

                   WHERE   X.Maintainid  =  E.Maintainid

                   AND     x.siteid  =  e.siteid ); -- 这里被更新表中所有字段都需要写全

 

2.4    采用row_number 分析函数取出重复的记录然后删除序号大于1 的记录

给出一个例子:

delete from aa where rowid in(select rid from(select rowid rid,row_number() over (partition by name order by id) as seq from aa) where seq>1);

3    测试案例

SYS@raclhr1> CREATE TABLE T_ROWS_LHR_20160809 AS SELECT * FROM SCOTT.EMP;

Table created.

SYS@raclhr1> INSERT INTO T_ROWS_LHR_20160809 SELECT * FROM T_ROWS_LHR_20160809;

14 rows created.

SYS@raclhr1> COMMIT;

Commit complete.

SYS@raclhr1> INSERT INTO T_ROWS_LHR_20160809 SELECT * FROM T_ROWS_LHR_20160809;

28 rows created.

SYS@raclhr1> COMMIT;

Commit complete.

SYS@raclhr1> SELECT COUNT(1) FROM T_ROWS_LHR_20160809;

  COUNT(1)

----------

        56

SYS@raclhr1> DELETE FROM T_ROWS_LHR_20160809

  2      WHERE ROWID NOT IN  (SELECT MAX(ROWID)

  3                        FROM T_ROWS_LHR_20160809 D

  4                       group by D.EMPNO,D.ENAME,D.JOB,D.MGR,D.DEPTNO);

42 rows deleted.

SYS@raclhr1> SELECT COUNT(1) FROM T_ROWS_LHR_20160809;

  COUNT(1)

----------

        14

SYS@raclhr1> COMMIT;

Commit complete.

您可能感兴趣的文档:

--结束END--

本文标题: Oracle如何删除表中重复记录

本文链接: https://www.lsjlt.com/news/173676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle如何删除表中重复记录
    1    引言 在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来 读诸 多不便,那么怎么删除这些重复没...
    99+
    2022-11-30
    oracle 如何 删除
  • oracle删除重复记录
    1.1 查找表中多余的重复记录 --查询出所有有重复的数据select DETAIL_ID,COMMENT_BODY,count(1)from BBSCOMMENTgroup by DETAIL_...
    99+
    2022-10-18
  • MySQL中如何删除表重复记录
    本篇文章给大家分享的是有关MySQL中如何删除表重复记录,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 创建实验...
    99+
    2022-10-18
  • MySQL 中如何删除单表重复记录
    本篇文章给大家分享的是有关MySQL 中如何删除单表重复记录,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、创建表test001 点击...
    99+
    2022-10-18
  • ORACLE恢复删除表或表记录
    一:表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的。一般步骤有: 1、从flash back里查询被删除的表 select...
    99+
    2022-10-18
  • 如何删除MySQL表中的所有重复记录?
    要从表中删除重复记录,我们可以使用 DELETE 命令。现在让我们创建一个表。 mysql> create table DuplicateDeleteDemo -> ( -> id int, -...
    99+
    2023-10-22
  • MySQL中删除重复记录
    工作中,我们经常有需要删除一些重复数据的这种需求。重复数据可能是程序bug造成的 好,让我们看看如何删除这些重复数据 删除重复数据的思路呢,是这样的,查看根据这个重复字段分组后的结果有没有大于1的情况如果有...
    99+
    2022-10-18
  • Oracle中怎么刪除表的重复记录
    本篇文章为大家展示了Oracle中怎么刪除表的重复记录,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 刪除 table:ZZMSTR.F...
    99+
    2022-10-18
  • oracle如何查看表删除记录
    要查看Oracle表中删除的记录,可以使用以下方法之一:1. 使用闪回查询:Oracle提供了闪回查询功能,可以以某个时间点的状态查...
    99+
    2023-08-31
    oracle
  • mysql中怎样删除重复记录
    这期内容当中小编将会给大家带来有关mysql中怎样删除重复记录,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、确认一下基表和过渡表的数据量。mysql> sele...
    99+
    2022-10-18
  • Sql Server中怎么删除数据表中重复记录
    这篇文章将为大家详细讲解有关Sql Server中怎么删除数据表中重复记录,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、生成一张临时表new_users...
    99+
    2022-10-18
  • mysql表中删除重复记录,只保留一条记录的操作
    mysql表中两个字段重复记录,只保留一条记录的操作 例如有一张学生表 其中name 和 class 相同的视为重复记录,需要保留一条记录,删除重复记录, 两种操作方式如下: 方法一: group ...
    99+
    2023-09-27
    mysql 数据库
  • oracle如何删除重复数据保留第一条记录
    小编给大家分享一下oracle如何删除重复数据保留第一条记录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!oracle删除重复数...
    99+
    2022-10-18
  • SQL中怎么删除ACCESS重复记录
    这期内容当中小编将会给大家带来有关SQL中怎么删除ACCESS重复记录,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 有两个意义上的重复记录,一是完全重复的记录...
    99+
    2022-10-18
  • MySQL中怎么删除重复的记录
    MySQL中怎么删除重复的记录,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、查找全部重复记录select * ...
    99+
    2022-10-18
  • mysql中删除重复记录的方法
    这篇文章主要讲解了“mysql中删除重复记录的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中删除重复记录的方法”吧! ...
    99+
    2022-10-18
  • MySQL如何查询和删除重复记录
    这篇文章运用简单易懂的例子给大家介绍MySQL如何查询和删除重复记录,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。查找所有重复标题的记录:select title,count...
    99+
    2022-10-18
  • mysql中怎么删除表部分关键字段重复记录
    这篇文章给大家介绍mysql中怎么删除表部分关键字段重复记录,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 删除Date Server Item SubItem 完全相同,Id肯定不...
    99+
    2022-10-18
  • MySQL 如何查找并删除重复记录的实现
    大家好,我是只谈技术不剪发的 Tony 老师。由于一些历史原因或者误操作,可能会导致数据表中存在重复的记录;今天我们就来谈谈如何查找 MySQL 表中的重复数据以及如何删除这些重复的记录。 创建示例表 首先创建一个示...
    99+
    2022-05-11
    MySQL 查找重复记录 MySQL 删除重复记录
  • mysql删除数据库中重复记录的方法
    这篇文章给大家分享的是有关mysql删除数据库中重复记录的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。mysql删除数据库中重复记录的步骤:1、统计重复数据;2、使用“SE...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作