テーブル全体を書き直す余裕がある場合、これはおそらく最も簡単なアプローチです:
WITH Deleted AS (
DELETE FROM discogs.releases_labels
RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted
複製されたレコードを具体的にターゲットにする必要がある場合は、内部のctid
を利用できます。 行を一意に識別するフィールド:
DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM discogs.releases_labels
GROUP BY label, release_id, catno
)
ctid
には十分注意してください;時間の経過とともに変化します。ただし、1つのステートメントの範囲内で同じままであると信頼できます。