web-dev-qa-db-fra.com

Trouver des lignes en double avec PostgreSQL

Nous avons un tableau de photos avec les colonnes suivantes:

id, merchant_id, url 

cette table contient les valeurs en double pour la combinaison merchant_id, url. il est donc possible qu'une ligne apparaisse plusieurs fois.

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

Quel est le meilleur moyen de supprimer ces duplications? (J'utilise PostgreSQL 9.2 et Rails 3.)

66
Stefan Schmidt

Voici mon point de vue sur elle.

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

N'hésitez pas à jouer avec la commande en adaptant les enregistrements que vous souhaitez supprimer à votre spécification.

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


SQL Fiddle pour Postgres 9.2 n'est plus pris en charge; mettre à jour SQL Fiddle pour postgres 9.3

118
MatthewJ

La deuxième partie de la réponse de sgeddes ne fonctionne pas sur Postgres (le violon utilise MySQL). Voici une version mise à jour de sa réponse en utilisant 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

Je vois quelques options pour vous.

Pour un moyen rapide de le faire, utilisez quelque chose comme ceci (cela suppose que votre colonne d’identité n’est pas unique puisque vous mentionnez 234 fois plus haut):

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

Voici le SQL Fiddle .

Vous devrez ajouter vos contraintes à la table si vous en avez.

Si votre colonne ID est unique, vous pouvez faire quelque chose comme garder votre identifiant le plus bas:

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;  

Et le violon .

6
sgeddes