如何去掉表中的重复记录

来源:互联网 发布:淘宝钱盾认证 编辑:程序博客网 时间:2024/05/18 05:03

                                                                                    在Oracle11g中实验成功!        

第一种,数据全部重复,如下图:

                       

       需要得到以下的结果:

                       

       删除重复的记录(重复记录保留1条),可以按以下方法删除

         方法一:                    create   table   tablea_bak  as  select   distinct(a.*)   from   tableA   a   
                                  然后drop以前那个表  
                                  最后rename   tableA_bak   to   tableA      
                                  最好在不用这张表的时候。缺点:原表的注释将丢失。

 

      方法二:                delete from test where (id,name,ROWID) not in (select id,name,min(rowid) from test  group by id.name;
                                  id,name是test的字段,如果test有多个字段,要全部列出来。

 

      方法三(推荐):    delete from test  q1 WHERE rowid > (select min(rowid)  from  test q2
                                  where q1.id= q2.id and q1.name = q2.name group by id,name );                  

                                  该方法效率高于方法二。

       ......

       .....

       ......

 

***********************************************************************************************

      第二种,数据部分字段重复,ID不重复 ,如下图:

 

                                        

             需要得到以下结果:

                                      

           下面的语句可以达到要求:                

                方法一: create   table   tablea_bak  as  select   distinct(a.*)   from   tableA   a   
                        然后drop以前那个表  
                        最后rename   tableA_bak   to   tableA      
                        最好在不用这张表的时候。缺点:原表的注释将丢失。

 

            方法二(推荐):delete   from   tab_name   a   where   rowid   >   (select   min(rowid)   from   tab_name   b   where   a.关键字    =   b.关键字   group   by   关键字)

                       此方法的执行顺序:先按 group by 关键字 分组,分完组后,按组执行delete;   

                       此方法可以保留rowid最小的记录。

                       类推:保留rowid最大的记录   delete   from   tab_name   a   where   rowid   <   (select   max(rowid)   from   tab_name   b   where   a.关键字    =   b.关键字   group   by   关键字)

 

            方法三:delete from test where (name,ROWID) not in (select name,min(rowid) from test  group by name)   
                       name是test的重复字段,如果test有多个重复字段,要全部列出来。

 

 

       ......

       .....

       ......