SQLite
 sql >> Datenbank >  >> RDS >> SQLite

2 Möglichkeiten zum Löschen doppelter Zeilen in SQLite

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.