sql查询重复记录、删除重复记录方法大全

来源:互联网 发布:淘宝html5模板 编辑:程序博客网 时间:2024/06/07 12:44
查找所有重复标题的记录:
?
1
SELECT* FROMt_info a WHERE((SELECTCOUNT(*)FROMt_info WHERETitle = a.Title) > 1) ORDERBY Title DESC
一、查找重复记录
1、查找全部重复记录
?
1
Select* FromWhere重复字段 In(Select重复字段 FromGroupBy 重复字段 HavingCount(*)>1)
2、过滤重复记录(只显示一条)
?
1
Select* FromHZT WhereID In(SelectMax(ID)FromHZT GroupBy Title)
注:此处显示ID最大一条记录

二、删除重复记录
1、删除全部重复记录(慎用)
?
1
DeleteWhere重复字段 In(Select重复字段 FromGroupBy 重复字段 HavingCount(*)>1)
2、保留一条(这个应该是大多数人所需要的 ^_^)
?
1
DeleteHZT WhereID NotIn (SelectMax(ID)FromHZT GroupBy Title)

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

三、举例

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
?
1
select* frompeople wherepeopleId in(selectpeopleId frompeople groupby peopleId havingcount(peopleId) > 1)
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
?
1
2
deletefrom people wherepeopleId in(selectpeopleId frompeople groupby peopleId havingcount(peopleId) > 1)
androwid notin (selectmin(rowid)frompeople groupby peopleId havingcount(peopleId )>1)
3、查找表中多余的重复记录(多个字段)
?
1
select* fromvitae a where(a.peopleId,a.seq) in(selectpeopleId,seq fromvitae groupby peopleId,seq havingcount(*) > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
?
1
2
deletefrom vitae a where(a.peopleId,a.seq) in(selectpeopleId,seq fromvitae groupby peopleId,seq havingcount(*) > 1)
androwid notin (selectmin(rowid)fromvitae groupby peopleId,seq havingcount(*)>1)
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
?
1
2
select* fromvitae a where(a.peopleId,a.seq) in(selectpeopleId,seq fromvitae groupby peopleId,seq havingcount(*) > 1)
androwid notin (selectmin(rowid)fromvitae groupby peopleId,seq havingcount(*)>1)
四、补充
有两个以上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用
?
1
selectdistinct * fromtableName
就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
?
1
2
3
4
selectdistinct * into#Tmp fromtableName
droptable tableName
select* intotableName from#Tmp
droptable #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

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

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

?
1
2
3
selectidentity(int,1,1)asautoID, * into#Tmp fromtableName
selectmin(autoID)asautoID into#Tmp2 from#Tmp groupby Name,autoID
select* from#Tmp whereautoID in(selectautoID from#tmp2)

0 0
原创粉丝点击