在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有多个重复字段,要全部列出来。
......
.....
......