删除数据表中重复记录

删除数据表中重复记录

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-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值