场景:
在实际工作中,我们在进行数据插入,或者数据分析时在已经存在的表数据中往往发现会出现有数据重复的现象。
重复的数据分两种:
(1)表中部分字段的重复,(2)完全重复的记录。
1. 部分字段的重复:
(1)数据量小情况下,直接用SQL语句删除部分字段重复数据:
1)查询重复的数据SQL:
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
2)删除上面查询出的重复的数据并保留一条:
delete from 表名 a where rowid != (select max(rowid) from 表名 group by 字段1,字段2 having count(*) > 1)
(2)以上即是删除查询到的数据,这种删除执行效率低下,数据量大时,不适合,可以用临时表方式,
先将查询到的重复的数据插入到一张临时表,然后对其进行删除,这样,在执行删除的时候就不用再进行一次查询了。
1)建立临时表,并将查询到的数据插入其中
CREATE TABLE 临时表 AS
(select 字段1,字段2,max(rowid) mrowid from 表名 group by 字段1,字段2 having count(*) > 1)
2)再进行删除操作:
delete from 表名 a where rowid!= (select mrowid from 临时表 b where b.字段1=a.字段1 and b.字段2=a.字段2);
2. 完全重复记录的删除:
select distinct * from 表名
将查询的记录放进临时表,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。
CREATE TABLE 临时表 AS (select distinct * from 表名);
truncate table 正式表;
insert into 正式表 (select * from 临时表);
drop table 临时表;