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.)
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
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;
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 .