MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

2 Möglichkeiten zum Löschen doppelter Zeilen in MariaDB (ignoriert den Primärschlüssel)

Hier sind Beispiele für das Entfernen doppelter Zeilen aus einer Tabelle in MariaDB, wenn diese Zeilen einen Primärschlüssel oder eine eindeutige Kennungsspalte haben.

Die Beispiele löschen doppelte Zeilen, behalten aber eine bei. Bei zwei identischen Zeilen wird also eine gelöscht und die andere beibehalten.

Beispieldaten

Unsere Beispiele verwenden die folgenden Daten:

SELECT * FROM Dogs;

Ergebnis:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     2 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

Wir können sehen, dass die ersten beiden Zeilen sowie die letzten drei Zeilen Duplikate sind.

Die DogId Spalte enthält eindeutige Werte (weil es der Primärschlüssel der Tabelle ist), und daher gibt es streng genommen keine Duplikate. In realen Situationen möchten Sie jedoch häufig Tabellen deduplizieren, die Primärschlüssel enthalten. Daher ignorieren wir in diesem Artikel den Primärschlüssel und entdecken doppelte Werte in den verbleibenden Spalten.

Möglichkeit 1

Beginnen wir mit unserer ersten Option, indem wir alle Zeilen auswählen, die gelöscht werden sollen:

SELECT * FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Ergebnis:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     2 | Bark      | Smith    |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

Um diese doppelten Zeilen zu entfernen, können wir SELECT * wechseln zu DELETE :

DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Ergebnis:

Query OK, 3 rows affected (0.017 sec)

Und um das Ergebnis zu überprüfen, können wir alle verbleibenden Zeilen in der Tabelle auswählen:

SELECT * FROM Dogs;

Ergebnis:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Alternativ können wir den MAX() verwenden anstelle von MIN() Funktion, um zu ändern, welche Zeilen gelöscht werden.

Option 2

In diesem Beispiel gehen wir davon aus, dass die Tabelle in ihrem ursprünglichen Zustand (mit den Duplikaten) wiederhergestellt wurde.

Wir können die folgende Abfrage verwenden, um nach doppelten Zeilen zu suchen:

SELECT * 
FROM Dogs d1, Dogs d2 
WHERE d1.FirstName = d2.FirstName 
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId 
AND d1.DogId = (
    SELECT MAX(DogId) 
    FROM Dogs d3 
    WHERE d3.FirstName = d1.FirstName 
    AND d3.LastName = d1.LastName
);

Ergebnis:

+-------+-----------+----------+-------+-----------+----------+
| DogId | FirstName | LastName | DogId | FirstName | LastName |
+-------+-----------+----------+-------+-----------+----------+
|     2 | Bark      | Smith    |     1 | Bark      | Smith    |
|     7 | Wag       | Johnson  |     5 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |     6 | Wag       | Johnson  |
+-------+-----------+----------+-------+-----------+----------+

Und wir können diese Abfrage ändern, um die Duplikate zu löschen:

DELETE FROM Dogs WHERE DogId IN (
    SELECT d2.DogId 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName 
    AND d1.DogId <> d2.DogId 
    AND d1.DogId=( 
        SELECT MIN(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

Ergebnis:

Query OK, 3 rows affected (0.075 sec)

Die Tabelle wurde nun dedupliziert.

Wir können dies überprüfen, indem wir erneut alle Zeilen auswählen:

SELECT * FROM Dogs;

Ergebnis:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Wir können MAX() verwenden statt MIN() um die anderen Zeilen aus den Duplikaten zu löschen, falls gewünscht.