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

声明

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

クラスAとBでジョンの名前を維持するにはどうすればよいですか?

4

4 に答える 4

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
于 2012-07-07T03:49:52.470 に答える
2

このような重複の挿入さえ禁止するためのより良い方法は、複数列の一意のインデックスです(検索も最適化されます)。方法は次のとおりです。

ALTER TABLE `Student`
  ADD UNIQUE INDEX `idx` (`StudentName`, `StudentClass`)
于 2012-07-07T04:32:09.417 に答える
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を選択します。次に、そのクラスと名前に一致するものをすべて削除しますが、最小IDに一致しないため、1日の終わりに、(おそらく)最初のレコードを重複から除外し、残りを削除します。

于 2012-07-07T05:12:26.340 に答える
0

StudentsJOINが重複する学生と一致することを保証するJOIN述語を使用して、それ自体に対して結合し、結合された行を削除できるはずです。

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

注:最初にデータをバックアップしてください。私は失われたデータに対して責任を負いません:-)これは概念的な考えであり、テストされていません。

于 2012-07-07T03:45:21.483 に答える