czj4451 发表于 2013-1-14 08:51:31

删除数据库中的重复记录

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

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

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

Table result

idnamecourse    score
1   JohnBiology   90
2   JohnBiology   90
3   LisaChemistry 80
4   JohnBiology   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
idnamecourse    score
1   JohnBiology   90
1   JohnBiology   90
2   LisaChemistry 80
1   JohnBiology   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)
页: [1]
查看完整版本: 删除数据库中的重复记录