2010-09-23 23 views
12

Ich benutze Postgres. Ich möchte doppelte Zeilen löschen. Die Bedingung ist, dass 1 Kopie aus der Menge der doppelten Zeilen nicht gelöscht wird.Doppelte Zeilen löschen (nicht alle Duplikate löschen)

if: Wenn 5 doppelte Datensätze vorhanden sind, werden 4 davon gelöscht.

+1

möglich Duplikat [Wie doppelte Zeilen mit SQL löschen?] (Http://stackoverflow.com/questions/1173963/how-to-delete-duplicate-rows-with-sql) –

+1

wie ironisch! lol 'mögliche Duplikate, wie Duplikate zu löschen' ... –

Antwort

17

Versuchen Sie die in diesem Artikel beschriebenen Schritte: Removing duplicates from a PostgreSQL database.

Es beschreibt eine Situation, wenn Sie mit großen Datenmengen umgehen müssen, die group by nicht möglich ist.

Eine einfache Lösung wäre dies:

DELETE FROM foo 
     WHERE id NOT IN (SELECT min(id) --or max(id) 
         FROM foo 
         GROUP BY hash) 

Wo hash etwas ist, das dupliziert wird.

+0

löscht dies nicht alle Zeilen, die auch keine Duplikate haben? – pomarc

+0

@pomarc nein, weil es dieses kleine Gleichheitszeichen (=) vor 1 gibt, das uns sagt, dass wir min (id) von allen möglichen Gruppen nehmen wollen, sogar diejenigen, die nur ein Mitglied enthalten; Also, keine Sorge, Sie werden keine Daten löschen, die nicht dupliziert sind –

+0

ist die Zählung (*)> = 1 notwendig? Ich bekomme das gleiche Ergebnis, wenn ich folgendes ausführe: DELETE FROM foo WHERE ID NICHT IN (SELECT min (id) FROM foo GROUP BY Hash) – grteibo

2
delete from table 
where not id in 
(select max(id) from table group by [duplicate row]) 

Dies ist eine zufällige (max Value) Auswahl, welche Zeile Sie behalten müssen. Wenn Sie aggre whit haben, geben Sie bitte weitere Details an

1

Das schnellste ist, verbinden Sie zu der gleichen Tabelle. http://www.postgresql.org/docs/8.1/interactive/sql-delete.html

CREATE TABLE test(id INT,id2 INT); 
CREATE TABLE 
mapy=# INSERT INTO test VALUES(1,2); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,3); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,4); 
INSERT 0 1 

DELETE FROM test t1 USING test t2 WHERE t1.id=t2.id AND t1.id2<t2.id2; 
DELETE 2 
mapy=# SELECT * FROM test; 
id | id2 
----+----- 
    1 | 4 
(1 row) 
Verwandte Themen