欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL中查询、删除重复记录的方法大全

程序员文章站 2022-04-16 12:01:37
前言 本文主要给大家介绍了关于mysql中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select t...

前言

本文主要给大家介绍了关于mysql中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍:

查找所有重复标题的记录:

select title,count(*) as count from user_table group by title having count>1; 
select * from t_info a where ((select count(*) from t_info where title = a.title) > 1) order by title desc

一、查找重复记录

1、查找全部重复记录

select * from t_info a where ((select count(*) from t_info where title = a.title) > 1) order by title desc

2、过滤重复记录(只显示一条)

select * from hzt where id in (select max(id) from hzt group by title)

注:此处显示id最大一条记录

二、删除重复记录

1、删除全部重复记录(慎用

delete 表 where 重复字段 in (select 重复字段 from 表 group by 重复字段 having count(*)>1)

2、保留一条(这个应该是大多数人所需要的 ^_^)

delete hzt where id not in (select max(id) from hzt group by title)

注:此处保留id最大一条记录

三、举例

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleid)来判断

select * from people where peopleid in (select peopleid from people group by peopleid having count(peopleid) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleid)来判断,只留有rowid最小的记录

delete from people where peopleid in (select peopleid from people group by peopleid having count(peopleid) > 1) and rowid not in (select min(rowid) from people group by peopleid having count(peopleid )>1)

3、查找表中多余的重复记录(多个字段)

select * from vitae a where (a.peopleid,a.seq) in (select peopleid,seq from vitae group by peopleid,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a where (a.peopleid,a.seq) in (select peopleid,seq from vitae group by peopleid,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleid,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae a where (a.peopleid,a.seq) in (select peopleid,seq from vitae group by peopleid,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleid,seq having count(*)>1)

四、补充

有两个以上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

select distinct * from tablename

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #tmp from tablename
drop table tablename
select * into tablename from #tmp
drop table #tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

假设有重复的字段为name,address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoid, * into #tmp from tablename
select min(autoid) as autoid into #tmp2 from #tmp group by name,autoid
select * from #tmp where autoid in(select autoid from #tmp2)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。