Jeśli możesz sobie pozwolić na przepisanie całej tabeli, jest to prawdopodobnie najprostsze podejście:
WITH Deleted AS (
DELETE FROM discogs.releases_labels
RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted
Jeśli chcesz celować w zduplikowane rekordy, możesz skorzystać z wewnętrznego ctid
pole, które jednoznacznie identyfikuje wiersz:
DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM discogs.releases_labels
GROUP BY label, release_id, catno
)
Bądź bardzo ostrożny z ctid
; zmienia się w czasie. Ale możesz polegać na tym, że pozostanie on taki sam w zakresie jednej instrukcji.