经常因为忘记设置主键或者unique约束导致了本不能重复的表中出现了很多重复的记录,有的是部分字段内容相同导致的重复,有的是主键(本该设置主键但没设置的字段)相同导致的重复,有的是整条记录导致的重复。
如果是整条记录重复,那么去除重复是很简单的:
create table temp_a1 as (select distinct * from a ) --先将去掉重复的记录存放到临时表。
delete from a --再删掉原表的所有记录;
insert into a (select * from temp_a1 ) --再将去掉重复后的记录转移到原表。
对于部分字段值相同导致的重复,如何查出重复的记录:
select * from
( select count(*) cnt ,t.a1,t.a2
from a t group by t.a1, t.a2
) where cnt !=1
说明:内部子查询用于查询出原表a中字段a1,a2的值完全相同的记录,然后分组统计个数。
外查询是在该统计结果中筛选出个数不等于1(也就是有重复的记录)的信息,
根据这些信息就可以大概知道哪些记录重复了。
具体操作:
create table b as
select count(*) cnt ,t.a1,t.a2, Max(a.rowid) dataid
from a t group by t.a1, t.a2;
--将原表中字段a1,a2未重复的记录的rowid记录下来,对于重复的记录其中较大的rowid。
这样得到的rowid就是未重复的记录的所有的rowid了。
delete from a where a.rowid!=(select b.dataid from b where a.a1=b.a1 and a.a2=b.a2)
将原表中a1,a2字段值重复的记录直接删掉。
这样就达到了去掉部分字段值重复的记录的目的了。