2012-07-07 61 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,因此在一天結束時,我們保留(假定)第一條記錄不符合重複記錄並根除其餘記錄。