Ich habe eine Tabelle in einer PostgreSQL 8.3.8-Datenbank, die keine Schlüssel / Einschränkungen enthält und mehrere Zeilen mit genau denselben Werten enthält.
Ich möchte alle Duplikate entfernen und nur 1 Kopie jeder Zeile behalten.
Es gibt insbesondere eine Spalte (mit dem Namen "Schlüssel"), die zur Identifizierung von Duplikaten verwendet werden kann (dh es sollte nur ein Eintrag für jeden einzelnen "Schlüssel" vorhanden sein).
Wie kann ich das machen? (idealerweise mit einem einzelnen SQL-Befehl) Geschwindigkeit ist in diesem Fall kein Problem (es gibt nur wenige Zeilen).
sql
postgresql
duplicates
André Morujão
quelle
quelle
Eine schnellere Lösung ist
quelle
ctid
?Das ist schnell und prägnant:
Siehe auch meine Antwort unter So löschen Sie doppelte Zeilen ohne eindeutige Kennung, die weitere Informationen enthält.
quelle
ctid
zeigt auf den physischen Speicherort des Datensatzes in der Tabelle. Im Gegensatz zu dem, was ich damals im Kommentar geschrieben habe, verweist die Verwendung des Operators "kleiner als" nicht unbedingt auf die ältere Version, da das ct umlaufen kann und ein Wert mit einer niedrigeren ctid möglicherweise tatsächlich neuer ist.min(ctid)
? während deine die neueren behalten? Vielen Dank!Ich habe es versucht:
bereitgestellt von Postgres Wiki:
https://wiki.postgresql.org/wiki/Deleting_duplicates
quelle
id
einschließlich.id
Spalte1 ... 3 doppelt vorhanden sindIch musste meine eigene Version erstellen. Die von @a_horse_with_no_name geschriebene Version ist in meiner Tabelle viel zu langsam (21 Millionen Zeilen). Und @rapimo löscht einfach keine Dups.
Folgendes verwende ich unter PostgreSQL 9.5
quelle
Ich würde eine temporäre Tabelle verwenden:
Dann löschen
tab
und umbenennentab_temp
intab
.quelle
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Ein anderer Ansatz (funktioniert nur, wenn Sie ein eindeutiges Feld wie
id
in Ihrer Tabelle haben) besteht darin, alle eindeutigen IDs nach Spalten zu suchen und andere IDs zu entfernen, die nicht in der eindeutigen Liste enthalten sindquelle
Wie wäre es mit:
Ich war besorgt über die Ausführungsreihenfolge, würde das LÖSCHEN vor dem SELECT DISTINCT erfolgen, aber es funktioniert gut für mich. Und hat den zusätzlichen Vorteil, dass Sie keine Kenntnisse über die Tabellenstruktur benötigen.
quelle
json
dies nicht funktioniert , wenn Sie einen Datentyp haben, der keine Gleichheit unterstützt (z. B. ).Das hat bei mir gut funktioniert. Ich hatte eine Tabelle, Begriffe, die doppelte Werte enthielten. Es wurde eine Abfrage ausgeführt, um eine temporäre Tabelle mit allen doppelten Zeilen zu füllen. Dann habe ich die Anweisung a delete mit diesen IDs in der temporären Tabelle ausgeführt. value ist die Spalte, die die Duplikate enthielt.
quelle
Hier ist eine Lösung mit
PARTITION BY
:quelle