数据库产生重复数据记录是经常发生的事情,现在nowamagic总结下各种重复的情况,每一种情况该如何写sql语句处理。 查找所有重复标题的记录: select *from t_info awhere ((select count(*) from t_info where title = a.title) > 1)order by title desc 查
数据库产生重复数据记录是经常发生的事情,现在nowamagic总结下各种重复的情况,每一种情况该如何写sql语句处理。
查找所有重复标题的记录:
select * from t_info a where ((select count(*) from t_info where title = a.title) > 1) order by title desc查找全部重复记录:
select * from 表 where 重复字段 in (select 重复字段 from 表 group by 重复字段 having count(*)>1)过滤重复记录(只显示一条):
select * from hzt where id in (select max(id) from hzt group by title)注:此处显示id最大一条记录。
删除全部重复记录(慎用):
delete 表 where 重复字段 in (select 重复字段 from 表 group by 重复字段 having count(*)>1)保留一条(这个应该是大多数人所需要的 ^_^):
delete hzt where id not in (select max(id) from hzt group by title)注:此处保留id最大一条记录。
查找表中多余的重复记录,重复记录是根据单个字段(peopleid)来判断:
select * from people where peopleid in (select peopleid from people group by peopleid having count(peopleid) > 1)删除表中多余的重复记录,重复记录是根据单个字段(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)查找表中多余的重复记录(多个字段):
select * from vitae a where (a.peopleid,a.seq) in (select peopleid,seq from vitae group by peopleid,seq having count(*) > 1)删除表中多余的重复记录(多个字段),只留有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)查找表中多余的重复记录(多个字段),不包含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字段重复,而其他字段不一定重复或都重复可以忽略。
对于第一种重复,比较容易解决,使用:
select distinct * from tablename就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除:
select distinct * into #tmp from tablename drop table tablename select * into tablename from #tmp drop table #tmp发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
第二类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:
假设有重复的字段为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)【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!