5分钟学会Oracle删除重复数据的方法

    作者:课课家更新于: 2019-02-27 20:12:03

    软考,您想通过吗?一次通过才是硬道理

      有时候为了方便管理数据库我们就需要对数据库中的重复数据进行删除的操作,那么面对数据库中的重复数据我们该如何进行删除的操作呢?在本文中课课家笔者就以Oracle数据库为例详细为大家介绍Oracle删除重复数据的方法供大家参考参考。

    5分钟学会Oracle删除重复数据的方法

     


     

      一般来说重复的数据可能有这样两种情况:

      ● 表中只有某些字段一样

      ● 两行记录完全一样

      下面笔者就已这两种情况作详细的删除方法的介绍。

      


     

      部分字段重复数据的删除

      查询重复的数据

      select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

      下面是具体的演示实例:

      Select owner from dba_tables group by owner having count(*)> 1;

      Select owner from dba_tables group by owner having count(*)=1; //查询出没有重复的数据

      删除重复的数据

      删除重复的数据有两种方法:

      delete from 表名 a where 字段1,字段2 in (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*)> 1)

      但是这种删除执行的方法其效率非常低,如果是大数据量的话则很有可能将数据库吊死。

      另一种高效率的方法是先将查询到的重复的数据插入到一个临时表中,然后再进行删除。

      CREATE TABLE 临时表 AS

      (

      select 字段1,字段2,count(*) as row_num

      from 表名

      group by 字段1,字段2

      having count(*) > 1

      );

      上面的命令就是建立了临时表并将查询到的数据插入其中。接下来我们就可以进行如下的删除操作了:

      delete from 表名 a

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

      保留重复数据中最新的一条记录

      在Oracle中rowid是隐藏字段,其作用是用来唯一标识每条记录。所以我们只要保留重复数据中rowid最大的一条记录就可以了。

      ● 查询重复数据:

      select a.rowid,a.* from 表名 a

      where a.rowid!=(

      select max(b.rowid) from 表名 b

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

      下面是具体的演示实例:

      selete from dba_tables a

      where a.rowid!=(

      select max(rowid) from test b

      where a.owner=b.owner);

      ● 下面是删除重复数据只保留最新的一条数据的方法:

      delete from 表名 a

      where a.rowid!=(

      select max(b.rowid) from 表名 b

      where a.字段1 = b.字段1 and a.字段2 = b.字段2)

      ● 下面是使用临时表实现高效查询的方法:

      create table 临时表 as

      (select a.字段1,a.字段2,MAX(a.ROWID) as dataid from 正式表 a

      GROUP BY a.字段1,a.字段2);

      delete from 表名 a

      where a.rowid ! =

      (select b.dataid from 临时表 b

      where a.字段1 = b.字段1 and

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

      commit;

      


     

      完全重复记录的删除

      对于表中两行记录完全一样的情况我们可以通过使用如下语句获取到去掉重复数据后的记录:

      select distinct* from 表名

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

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

      drop table 正式表;

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

      drop table 临时表;

      如果我们想删除一个表的重复数据则可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,具体如下所示:

      INSERT INTO t_table_bak

      select distinct* from t_table;

     


     

      以上就是Oracle删除重复数据的方法的介绍,大家如果觉得笔者的方法可以的话不妨收藏一下哦!另外如果大家觉得笔者的文章中有不足的地方时笔者欢迎大家对本文章中出现的讲解提出自己的个人建议,对出现错误的地方提出批评,笔者会诚心接纳大家的建议和批评,并根据大家提出的建议和批评作出相应的修改工作。最后笔者希望本次的文章对大家学习Oracle能够起到一定的帮助作用!

课课家教育

未登录