PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Supprimer les lignes en double de la table sans clé unique

Si vous pouvez vous permettre de réécrire tout le tableau, c'est probablement l'approche la plus simple :

WITH Deleted AS (
  DELETE FROM discogs.releases_labels
  RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted

Si vous avez besoin de cibler spécifiquement les enregistrements dupliqués, vous pouvez utiliser le ctid interne champ, qui identifie de manière unique une ligne :

DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
  SELECT MIN(ctid)
  FROM discogs.releases_labels
  GROUP BY label, release_id, catno
)

Soyez très prudent avec ctid; ça change avec le temps. Mais vous pouvez être sûr qu'il reste le même dans le cadre d'une seule instruction.