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.