PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Excluir linhas duplicadas da tabela sem chave exclusiva


Se você puder reescrever a tabela inteira, esta é provavelmente a abordagem mais simples:
WITH Deleted AS (
  DELETE FROM discogs.releases_labels
  RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted

Se você precisar segmentar especificamente os registros duplicados, poderá usar o ctid interno campo, que identifica exclusivamente uma linha:
DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
  SELECT MIN(ctid)
  FROM discogs.releases_labels
  GROUP BY label, release_id, catno
)

Tenha muito cuidado com ctid; ele muda com o tempo. Mas você pode confiar que ele permanecerá o mesmo dentro do escopo de uma única declaração.