it-swarm.com.de

Finden Sie doppelte Zeilen mit PostgreSQL

Wir haben eine Tabelle mit Fotos mit den folgenden Spalten:

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 vorkommt.

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, um diese Duplikate zu löschen? (Ich benutze PostgreSQL 9.2 und Rails 3.)

66
Stefan Schmidt

Hier ist meine Meinung dazu.

select * from (
  SELECT id,
  ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row
  FROM Photos
) dups
where 
dups.Row > 1

Spielen Sie mit der Bestellung, indem Sie die zu löschenden Datensätze auf Ihre Spezifikation zuschneiden.

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


SQL Fiddle für Postgres 9.2 wird nicht mehr unterstützt; Aktualisierung von SQL Fiddle auf Postgres 9.3

118
MatthewJ

Der zweite Teil der Antwort von sgeddes funktioniert nicht auf Postgres (die Geige benutzt 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;  
9
11101101b

Ich sehe ein paar Optionen für Sie.

Verwenden Sie für eine schnelle Vorgehensweise Folgendes (es wird davon ausgegangen, dass Ihre ID-Spalte nicht eindeutig ist, da Sie 234 oben mehrfach erwähnt haben):

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

Hier ist die SQL-Geige .

Sie müssen Ihre Einschränkungen ggf. wieder der Tabelle hinzufügen.

Wenn Ihre ID-Spalte eindeutig ist, können Sie beispielsweise Ihre niedrigste ID beibehalten:

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 Geige .

6
sgeddes