Nếu bạn có đủ khả năng để viết lại toàn bộ bảng, đây có lẽ là cách tiếp cận đơn giản nhất:
WITH Deleted AS (
DELETE FROM discogs.releases_labels
RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted
Nếu bạn cần nhắm mục tiêu cụ thể các bản ghi được sao chép, bạn có thể sử dụng ctid
nội bộ trường xác định duy nhất một hàng:
DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM discogs.releases_labels
GROUP BY label, release_id, catno
)
Hãy hết sức cẩn thận với ctid
; nó thay đổi theo thời gian. Nhưng bạn có thể dựa vào việc nó giữ nguyên trong phạm vi của một câu lệnh duy nhất.