2013-01-23 3 views
59

Wir haben eine Tabelle von Fotos mit den folgenden Spalten:Finden Sie doppelte Zeilen mit PostgreSQL

id, merchant_id, url 

Diese Tabelle enthält doppelte Werte für die Kombination merchant_id, url. Es ist also möglich, dass eine Zeile mehrmals erscheint.

234 some_merchant http://www.some-image-url.com/abscde1213 
235 some_merchant http://www.some-image-url.com/abscde1213 
236 some_merchant http://www.some-image-url.com/abscde1213 

Was ist der beste Weg, diese Duplikate zu löschen? (Ich verwende PostgreSQL 9.2 und Rails 3.)

+1

Ist Ihre ID-Spalte einzigartig? Ich sehe 234 dreimal, aber Sie sagen, dass Ihre Merchant_id und URL die doppelten Werte sind. – sgeddes

+0

Mögliche Duplikat von http://StackOverflow.com/Questions/1746213/How-To-Delete-duplicate-entries-in-Postgresql –

+0

Sorry für die Verwirrung. Die ID im obigen Beispiel sollte eindeutig sein. Danke für die korrekte Bearbeitung. Die Lösung hier stackoverflow.com/questions/1746213/... funktioniert nicht für meinen Fall. –

Antwort

105

Hier ist meine Sicht darauf.

Fühlen Sie sich frei, mit der Reihenfolge zu spielen, um die Datensätze, die Sie löschen möchten, an Ihre Spezifikation anzupassen.

SQL Fiddle =>http://sqlfiddle.com/#!15/d6941/1/0


SQL Fiddle für Postgres 9.2 wird nicht mehr unterstützt; Update SQL Fiddle zu Postgres 9.3

+2

Dieses funktioniert wie ein Charme aber wie geht es Ihnen die mit dieser Abfrage gefundenen Duplikate löschen? –

+1

Bitte seien Sie vorsichtig http://sqlfiddle.com/#!12/796d6/133 – MatthewJ

+0

Wenn wir die gleiche Sache haben, die sich 3 Mal wiederholt, nehmen Sie Take 2 und Take 3 als Ergebnis. Wie kann ich es lösen? –

6

Ich sehe ein paar Optionen für Sie.

Für einen schnellen Weg, es zu tun, verwenden Sie so etwas wie dieses (nimmt Ihre ID-Spalte nicht eindeutig zuzuordnen sind, wie Sie 234 mehrmals oben erwähnt):

CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos; 
DROP TABLE Photos; 
ALTER TABLE tmpPhotos RENAME TO Photos; 

Hier ist die SQL Fiddle.

Sie müssen Ihre Einschränkungen zurück zur Tabelle hinzufügen, wenn Sie welche haben.

Wenn Ihre ID-Spalte eindeutig zuzuordnen sind, könnten Sie etwas tun, wie Sie Ihre niedrigsten ID zu halten:

DELETE FROM P1 
USING Photos P1, Photos P2 
WHERE P1.id > P2.id 
    AND P1.merchant_id = P2.merchant_id 
    AND P1.url = P2.url; 

Und die Fiddle.

+2

die ID ist einzigartig in meinem Fall. Ich habe es in meinem Beispielcode einfach falsch gemacht. aber ich erhalte einen Fehler, wenn ich versuche, Ihre zweite Lösung zu verwenden. 'FEHLER: Beziehung" p1 "existiert nicht –

+0

@StefanSchmidt Ich reparierte es, um auf Postgres anstelle von MySQL zu laufen: http://sqlfiddle.com/#!12/6b1a7/1 – 11101101b

8

Der zweite Teil von Sgeddes Antwort funktioniert nicht auf Postgres (die Geige verwendet MySQL). Hier ist eine aktualisierte Version seiner Antwort mit Postgres: http://sqlfiddle.com/#!12/6b1a7/1

DELETE FROM Photos AS P1 
USING Photos AS P2 
WHERE P1.id > P2.id 
    AND P1.merchant_id = P2.merchant_id 
    AND P1.url = P2.url;