交流区软件相关 >> MySQL查询重复字段,及删除重复记录的方法
楼主 MySQL查询重复字段,及删除重复记录的方法 Karlson,2014-01-08 12:00:31

[P]MySQL查询重复字段,及删除重复记录的方法(转)[/P][P][/P][P]Submitted by wiley on Thu, 09/03/2009 - 21:36[/P][P][教学] MySQL查询重复字段,及删除重复记录的方法[/P][P]MySQL, 数据库, 数据库, 字段, 服务器[/P][P]数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较。如果仅仅是查找数据库中name不重复的字段,很容易:[/P][P]SELECT min(`id`),`name` FROM `table` GROUP BY `name`;[/P][P]但是这样并不能得到说有重复字段的id值。(只得到了最小的一个id值)查询哪些字段是重复的也容易:[/P][P]SELECT `name`,count(`name`) as count FROM `table` GROUP BY `name` HAVING count(`name`) >1 ORDER BY count DESC;[/P][P]但是要一次查询到重复字段的id值,就必须使用子查询了,于是使用下面的语句。[/P][P]SELECT `id`,`name` FROM `table` WHERE `name` in ([/P][P]SELECT `name`[/P][P]FROM `table`[/P][P]GROUP BY `name` HAVING count(`name`) >1);[/P][P]但是这条语句在mysql中效率太差,感觉mysql并没有为子查询生成零时表。于是使用先建立零时表:[/P][P]create table `tmptable` as ([/P][P]SELECT `name`[/P][P]FROM `table`[/P][P]GROUP BY `name` HAVING count(`name`) >1);[/P][P]然后使用多表连接查询:[/P][P]SELECT a.`id`, a.`name` FROM `table` a, `tmptable` t WHERE a.`name` = t.`name`;[/P][P]结果这次结果很快就出来了。[/P][P]========================[/P][P]查询及删除重复记录的方法[/P][P](一)[/P][P]1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断[/P][P]select * from people[/P][P]where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)[/P][P]2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录[/P][P]delete from people[/P][P]where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)[/P][P]and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)[/P][P]3、查找表中多余的重复记录(多个字段)[/P][P]select * from vitae a[/P][P]where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)[/P][P]4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录[/P][P]delete from vitae a[/P][P]where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)[/P][P]and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)[/P][P]5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录[/P][P]select * from vitae a[/P][P]where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)[/P][P]and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)[/P][P](二)[/P][P]比方说[/P][P]在A表中存在一个字段「name」,[/P][P]而且不同记录之间的「name」值有可能会相同,[/P][P]现在就是需要查询出在该表中的各记录之间,「name」值存在重复的项;[/P][P]Select Name,Count(*) From A Group By Name Having Count(*) > 1[/P][P]如果还查性别也相同大则如下:[/P][P]Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1[/P][P](三)[/P][P]方法一[/P][P]declare @max integer,@id integer[/P][P]declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1[/P][P]open cur_rows[/P][P]fetch cur_rows into @id,@max[/P][P]while @@fetch_status=0[/P][P]begin[/P][P]select @max = @max -1[/P][P]set rowcount @max[/P][P]delete from 表名 where 主字段 = @id[/P][P]fetch cur_rows into @id,@max[/P][P]end[/P][P]close cur_rows[/P][P]set rowcount 0[/P][P]  方法二[/P][P]  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键词段重复的记录,比如Name字段重复,而其它字段不一定重复或都重复可以忽略。[/P][P]  1、对于第一种重复,比较容易解决,使用[/P][P]select distinct * from tableName[/P][P]  就可以得到无重复记录的结果集。[/P][P]  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除[/P][P]select distinct * into #Tmp from tableName[/P][P]drop table tableName[/P][P]select * into tableName from #Tmp[/P][P]drop table #Tmp[/P][P]  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。[/P][P]  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下[/P][P]  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集[/P][P]select identity(int,1,1) as autoID, * into #Tmp from tableName[/P][P]select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID[/P][P]select * from #Tmp where autoID in(select autoID from #tmp2)[/P][P]  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)[/P][P](四)[/P][P]查询重复[/P][P]select * from tablename where id in ([/P][P]select id from tablename[/P][P]group by id[/P][P]having count(id) > 1[/P][P])[/P]
1帖子等待审核中... zkkxgy2015,2015-07-18 14:42:03

……………………………………………………隐藏内容…
此帖有待管理人员审核才能查看
…………………………………………………………………

1
登录才能发表帖子,<点此登录>,如未注册<点此注册>
内容:

[移动版 | 传统版 | 回顶部]
Page created in 0.0781 seconds width 2 queries.