Doppelte Zeilen aus einer kleinen Tabelle mit eindeutigen Spalten entfernen
In PostgreSQL-Datenbanken kann die Eliminierung doppelter Zeilen die Datenintegrität verbessern und die Leistung optimieren. Nehmen wir an, Sie haben eine Tabelle, die uneingeschränkte Zeilen und doppelte Daten enthält, insbesondere in einer bestimmten Spalte namens „Schlüssel“. Das Ziel besteht darin, Duplikate zu entfernen und eine einzelne Instanz jedes eindeutigen „Schlüssel“-Werts beizubehalten.
Einzelne SQL-Befehlslösung
Um dies mit einem einzigen SQL-Befehl zu tun, können Sie die folgenden Schritte verwenden:
1. Identifizieren Sie das erste wiederholte Vorkommen: Zuerst müssen wir das erste Vorkommen jeder wiederholten Zeile identifizieren. Diese Informationen sind für die Aufbewahrung einer einzigen Kopie der Daten von entscheidender Bedeutung.
<code class="language-sql">SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1;</code>
2. Nicht-erstes Vorkommen löschen: Sobald das erste Vorkommen identifiziert ist, können wir alle nachfolgenden Duplikate basierend auf ihrem „ctid“-Wert entfernen. Die Spalte „ctid“ stellt die physische Position der Zeile in der Tabelle dar.
<code class="language-sql">DELETE FROM dups a USING ( SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1 ) b WHERE a.key = b.key AND a.ctid <> b.ctid;</code>
Zeilenreihenfolge berücksichtigen
Während diese Methode Duplikate effektiv entfernt, stellt sie nicht sicher, welche Zeile bei mehrfachem Vorkommen beibehalten wird. Wenn es bestimmte Kriterien für die Auswahl der zu behaltenden Zeilen gibt, sollten diese in die Abfrage einbezogen werden.
Beispiel:
Betrachten Sie zum besseren Verständnis das folgende Beispiel:
<code class="language-sql">CREATE TABLE people ( name VARCHAR(50) NOT NULL, surname VARCHAR(50) NOT NULL, age INTEGER NOT NULL ); INSERT INTO people (name, surname, age) VALUES ('A.', 'Tom', 30), ('A.', 'Tom', 10), ('B.', 'Tom', 20), ('B', 'Chris', 20); -- 显示重复项的第一次出现: SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1; -- 删除重复项的非第一次出现: DELETE FROM people a USING ( SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1 ) b WHERE a.name = b.name AND a.surname = b.surname AND a.ctid <> b.ctid; SELECT * FROM people;</code>
Diese Beispieltabelle enthält potenziell doppelte personenbezogene Daten. Nach der Ausführung der zweiten Abfrage werden die Duplikate entfernt und es verbleiben nur noch eindeutige Vor- und Nachnamen in der Tabelle.
Das obige ist der detaillierte Inhalt vonWie lösche ich doppelte Zeilen aus einer PostgreSQL-Tabelle und behalte dabei eine eindeutige Spalte bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!