Die folgenden Optionen können verwendet werden, um doppelte Zeilen in SQLite zu löschen.
Diese Beispiele löschen doppelte Zeilen, behalten aber eine bei. Wenn also beispielsweise drei identische Zeilen vorhanden sind, werden zwei davon gelöscht und eine beibehalten. Dies wird oft als Deduplizierung der Tabelle bezeichnet.
Beispieldaten
Angenommen, wir haben eine Tabelle mit den folgenden Daten:
SELECT * FROM Pets;
Ergebnis:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Wir können sehen, dass die ersten beiden Zeilen Duplikate sind, ebenso wie die letzten drei Zeilen.
In diesem Fall sind alle Spalten Duplikate. Es gibt keinen Primärschlüssel. Die PetId
Spalte aussehen könnte wie es ein Primärschlüssel sein könnte, aber tatsächlich doppelte Werte enthält. Daher ist es keine eindeutige Kennung für jede Zeile und kann nicht als Primärschlüssel verwendet werden.
Wenn es einen Primärschlüssel gäbe, würde er in allen Zeilen eindeutige Werte enthalten, und es gäbe keine Duplikate.
In jedem Fall finden Sie unten zwei Optionen zum Suchen und Löschen doppelter Zeilen.
Option 1
Bevor wir die Tabelle deduplizieren, können wir die folgende Abfrage verwenden, um zu sehen, welche Zeile/n gelöscht werden:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Ergebnis:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Dies zeigt uns, dass drei Zeilen gelöscht werden, wenn wir die Tabelle im nächsten Schritt deduplizieren.
Um die doppelten Werte zu löschen, können wir die obige Abfrage ändern, indem wir SELECT *
ersetzen mit DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Ergebnis:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Die Tabelle wurde nun dedupliziert.
Wie erwartet wurde eine der doppelten Zeilen für unseren Hund „Wag“ gelöscht und die andere bleibt bestehen. Zwei der doppelten Zeilen für „Bark“ wurden ebenfalls gelöscht.
Der Grund, warum wir dies tun konnten, liegt in der rowid
von SQLite . Standardmäßig hat jede Zeile in SQLite eine spezielle Spalte, die normalerweise als rowid
bezeichnet wird , die diese Zeile innerhalb der Tabelle eindeutig identifiziert. Sofern es nicht ausdrücklich aus der Tabelle entfernt wurde, können Sie dies als eindeutige Kennung für jede Zeile verwenden, wodurch wir die obigen Abfragen erstellen können. Dasselbe gilt für das nächste Beispiel.
Option 2
Angenommen, die Tabelle wurde mit ihren ursprünglichen Daten (einschließlich doppelter Zeilen) wiederhergestellt, ist hier eine weitere Option zum Deduplizieren.
Prüfen Sie, welche Zeilen gelöscht werden:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Ergebnis:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Löschen Sie nun diese Zeilen:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Ergebnis:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Die Tabelle wurde dedupliziert.