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.