删除数据表中重复记录
Pet表结构及数据如下(要求删除字段"petName"相同的记录,保留最新一条即可):
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
| 4 | DODO | cat |
| 5 | WQWQ | cat |
| 6 | MOMO | cat |
+----+---------+---------+
6 rows in set
删除后结果:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
1、not in方式
Delete from t_pet where id not in( select id from t_pet group by petName );
保留重复记录的最后(最新)一条:
Delete from t_pet where id not in( select max(id) from t_pet group by petName );
注:在mysql数据库里上面的方法不可行,会抛出一个1093 - You can't specify target table 't_pet' for update in FROM clause 的错误,(+﹏+)。解决方案之一:我采用的创建临时表的方式,也就是先把查询出来的非重复记录的id放到临时表里,然后再删除,如:
① Drop table if exists temp_pet;
② Create temporary table select max(id) from t_pet group by petName;
③ Delete from t_pet where id not in ( select * from temp_pet );
这里也可以写一个存储过程来实现。
2、Left join 方式
Delete a from t_pet a left join ( select * from t_pet group by petName ) b on a.id = b.id where b.id is null;
以上方式mysql数据库同样有效。
分步骤说明下:
先看left join 查询语句得到的结果是:
+----+---------+---------+------+---------+---------+
| a.id | a.petName | a.petType | b.id | b.petName | b.petType |
+----+---------+---------+------+---------+---------+
| 4 | DODO | cat | NULL | NULL | NULL |
| 5 | WQWQ | cat | NULL | NULL | NULL |
| 6 | MOMO | cat | NULL | NULL | NULL |
+----+---------+---------+------+---------+---------+
至于为啥是这个结果不用我说了吧,以上结果就是重复的记录,可以对照上面的总表比对下!
最后当然就是删除这些记录,因为b.*字段全为null,所以删除a.*字段即可,剩下的就是非重复记录了,如下:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
好了,这里就介绍这两种方法,当然还有很多方法来实现重复记录的删除,有兴趣大家可以网上看看,很多好心人总结了一些不错的方法!
<!--EndFragment-->
<!--EndFragment-->
分享到:
相关推荐
主要介绍了Sql Server里删除数据表中重复记录的例子,本文给出了3种操作方法,需要的朋友可以参考下
Oracle数据库删除表中重复记录的方法三则.txt
该文档是本人在实验过程中遇到的一个需求,之后解决了,特此写一个文档,实现一条SQL语句删除数据库某一个表中重复的记录。(重复的记录只保留一条,其他的被删除)
在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...
Oracle查询重复数据与删除重复记录方法,Oracle查询重复数据与删除重复记录方法
我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢? 重复的数据可能有这样两种情况,第一种时表中只有某些字段相同,第二种是两行记录完全相同。 一...
plsql删除重复记录
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) select MIN(ID) as id, StructSN ,Date,UserID,StarCount,COUNT(StructSN) as c from T_Dor_StructStar where Date >= '20160919' group ...
by语句删除重复并保持一条重复记录,解决数据集中有重复记录的问题
Delphi自动删除数据库中重复记录..rar`
在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。重复记录判断的标准是:C1,C10和C20这三列的值都相同才算是重复记录。
总结一下几种查找和删除重复记录的方法,适用于有大量重复记录的情况
sql查询表中某字段下所有重复的记录,删除某字段下重复记录最小的那笔记录
Oracle查询重复数据并删除,只保留一条记录.docx
SQL,删除重复记录的方法,详细介绍了4种常用方法,将重复记录删除 只保留1条记录
oracle删除重复记录性能分析平时收集,希望能给需要帮助的人提供便利