zoukankan      html  css  js  c++  java
  • oracle 删除重复数据

    重复的数据可能有这样两种情况:

    第一种: 表中只有某些字段一样,第二种是两行记录完全一样。

     一、对于部分字段重复数据的删除

    1.查询重复的数据  

    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; //查询出没有重复的数据  

    2.删除重复的数据

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

    这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。

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

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

    上面这句话就是建立了临时表,并将查询到的数据插入其中。   

    C).下面就可以进行这样的删除操作了:

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

    D).保留重复数据中最新的一条记录在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

            );   

    3.删除重复数据,只保留最新的一条数据:

    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;

    详细出处参考:http://www.jb51.net/article/19287.htm

    <完>

    我需要慢慢的走上去,直到金字塔的顶峰。回过头来,看着自己一步一个的脚印,告诉后人:我,就是这么走过来的!
  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/liyumei/p/2424832.html
Copyright © 2011-2022 走看看