[size=large] 最近温习了一下如何在SQL中删除复生记录,感觉挺有趣。现将自己总结的几条方法归纳如下:
“重复记录”有两种意义,一种是表中的所有记录完全复复,(即表中的字段均重复),一种是表中的个别字段重复
1,对第一种重复,比较好解决
SELECT DISTINCT * FROM TABLENAME
可以复到无重复的记录
如果要删除多余的重复记录(只保留重复记录的一条记录),可以按下列方法操作
SELECT DISTINCT * INTO #TEMP FROM TABLENAME
DROP TABLE TABLENAME
SELECT * INTO TABLENAME FROM #TEMP
DROP TABLE #TEMP
出现这种问题是因为表的设计不周完,增加唯一性索引即可
2,个别字段的重复,如下
ID NAME VALUE
1 A PP
2 A PP
3 B II
4 B PP
5 B PP
6 C PP
7 C PP
8 C II
想要得到这样的结果
ID NAME VALUE
1 A PP
3 B II
4 B PP
6 C PP
8 C II
方法1
DELETE TABLENAME WHERE ID NOT IN
(SELECT MAX(ID) FROM TABLENAME GROUP BY NAME,VALUE HAVING COUNT(*)>1)
方法2
DELETE A FROM TABLENAME A LEFT JOIN
(SELECT ID=MIN(ID) FROM TABLENAME GROUP BY NAME,VALUE ) B ON A.ID=B.ID WHERE B.ID IS NULL
后续如有更好的例子,继续添加.........[/size]
“重复记录”有两种意义,一种是表中的所有记录完全复复,(即表中的字段均重复),一种是表中的个别字段重复
1,对第一种重复,比较好解决
SELECT DISTINCT * FROM TABLENAME
可以复到无重复的记录
如果要删除多余的重复记录(只保留重复记录的一条记录),可以按下列方法操作
SELECT DISTINCT * INTO #TEMP FROM TABLENAME
DROP TABLE TABLENAME
SELECT * INTO TABLENAME FROM #TEMP
DROP TABLE #TEMP
出现这种问题是因为表的设计不周完,增加唯一性索引即可
2,个别字段的重复,如下
ID NAME VALUE
1 A PP
2 A PP
3 B II
4 B PP
5 B PP
6 C PP
7 C PP
8 C II
想要得到这样的结果
ID NAME VALUE
1 A PP
3 B II
4 B PP
6 C PP
8 C II
方法1
DELETE TABLENAME WHERE ID NOT IN
(SELECT MAX(ID) FROM TABLENAME GROUP BY NAME,VALUE HAVING COUNT(*)>1)
方法2
DELETE A FROM TABLENAME A LEFT JOIN
(SELECT ID=MIN(ID) FROM TABLENAME GROUP BY NAME,VALUE ) B ON A.ID=B.ID WHERE B.ID IS NULL
后续如有更好的例子,继续添加.........[/size]