日期:2014-05-16  浏览次数:20407 次

删除数据库中的重复记录
数据库中存在重复记录分为两种:

1. 某些字段的值相同
2. 所有字段的值相同

对于第一种,可以采用连接的方式,条件是这些字段的值相同,并且其它字段的值大于或小于对应字段的值(只能取一种,等于表示同一条记录)

Table result

id  name  course    score
1   John  Biology   90
2   John  Biology   90
3   Lisa  Chemistry 80
4   John  Biology   90

查询所有的重复记录:
SELECT * FROM result a WHERE (a.name, a.course) IN(SELECT b.name, b.course FROM result b GROUP BY b.name, b.course HAVING COUNT(*) > 1)


查询多余的重复记录:
SELECT * FROM result a WHERE EXISTS (SELECT 1 FROM result b WHERE a.name=b.name AND a.course=b.course AND a.id > b.id)


删除多余的重复记录:
DELETE FROM result a WHERE EXISTS (SELECT 1 FROM result b WHERE a.name=b.name AND a.course=b.course AND a.id > b.id)


对于第二种,不同的数据库有不同的解决方案,SQL Server是用DISTINCT关键字,Oracle是ROWID

Table result
id  name  course    score
1   John  Biology   90
1   John  Biology   90
2   Lisa  Chemistry 80
1   John  Biology   90

SQL Server
删除多余的重复记录:
CREATE TABLE #tmp AS SELECT DISTINCT * FROM result;
TRUNCATE TABLE result;
INSERT INTO result SELECT * FROM #tmp;


Oracle
查询多余的重复记录:
SELECT * FROM result a WHERE a.ROWID > (SELECT MIN(ROWID) FROM result b WHERE a.id=b.id AND a.name=b.name AND a.course=b.course)


删除多余的重复记录:
DELETE FROM result a WHERE a.ROWID > (SELECT MIN(ROWID) FROM result b WHERE a.id=b.id AND a.name=b.name AND a.course=b.course)