2012-07-07 74 views
2

示例数据库中删除与组重复值:如何通过

ID StudentName StudentClass 
1 John  A 
2 John  B 
3 Peter  A 
4 John  A 
5 John  B 

我想结果应该是

ID StudentName StudentClass 
1 John  A 
2 John  B 
3 Peter  A 

Statment

DELETE FROM Student 
WHERE ID NOT IN (SELECT * 
        FROM (SELECT MIN(n.ID) 
          FROM Student n 
         GROUP BY n.StudentName) x) 

如何保持约翰姓名A & B

+1

将n.StudentClass添加到GROUP BY子句。 – spencer7593 2012-07-07 03:43:14

回答

2
DELETE a FROM Student a 
LEFT JOIN 
    (
     SELECT MIN(ID) AS minid 
     FROM Student 
     GROUP BY StudentName, StudentClass 
    ) b ON a.id = b.minid 
WHERE 
    b.minid IS NULL 
0

你应该能够加入Students对自身,与JOIN谓词确保连接匹配重复的学生,并删除join'd行:

DELETE 
    duplicate_students.* 
FROM Students JOIN Students as duplicate_students 
    ON Students.StudentName = duplicate_students.StudentName 
    AND Students.StudentClass = duplicate_students.StudentClass 
    AND duplicate_students.ID > Students.ID 

注:请您先备份您的数据;我对丢失的数据不承担任何责任:-)这是一个概念性的想法,尚未经过测试。

2

一个更好的方法来禁止即使是这样重复的插入会多列唯一索引(这将优化您的搜索太)。这里是如何:

ALTER TABLE `Student` 
    ADD UNIQUE INDEX `idx` (`StudentName`, `StudentClass`) 
0

这应该工作:

DELETE S FROM Student S 
INNER JOIN(
    SELECT MIN(ID) AS ID,StudentName,StudentClass FROM Student 
    GROUP BY StudentName,StudentClass 
) S2 ON S.ID != S2.ID AND S.StudentName = S2.StudentName AND S.StudentClass = S2.StudentClass 

它基本上选择最小ID出来的子查询中的所有重复的记录。然后我们简单地删除与Class和Name匹配的所有内容,但是我们不匹配最小ID,因此在一天结束时,我们保留(假定)第一条记录不符合重复记录并根除其余记录。