我们有一张包含以下列的照片表:
id, merchant_id, url
此表包含组合merchant_id, url
的重复值。所以有一行可能会出现多次。
234 some_merchant http://www.some-image-url.com/abscde1213
235 some_merchant http://www.some-image-url.com/abscde1213
236 some_merchant http://www.some-image-url.com/abscde1213
删除这些重复的最佳方法是什么? (我使用PostgreSQL 9.2和Rails 3。)
答案 0 :(得分:114)
这是我的看法。
select * from (
SELECT id,
ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row
FROM Photos
) dups
where
dups.Row > 1
可以根据您的规范定制要删除的记录,随意使用订单。
SQL Fiddle => http://sqlfiddle.com/#!15/d6941/1/0
不再支持Postgres 9.2的SQL小提琴;将SQL Fiddle更新为postgres 9.3
答案 1 :(得分:9)
sgeddes的第二部分回答并不适用于Postgres(小提琴使用MySQL)。以下是使用Postgres的答案的更新版本:http://sqlfiddle.com/#!12/6b1a7/1
DELETE FROM Photos AS P1
USING Photos AS P2
WHERE P1.id > P2.id
AND P1.merchant_id = P2.merchant_id
AND P1.url = P2.url;
答案 2 :(得分:6)
我为您看到了几个选项。
要快速执行此操作,请使用类似的内容(假设您的ID列不是唯一的,因为您多次提到234次):
CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos;
DROP TABLE Photos;
ALTER TABLE tmpPhotos RENAME TO Photos;
这是SQL Fiddle。
如果您有任何约束,则需要将约束添加回表中。
如果您的ID列是唯一的,您可以执行类似保持最低ID的内容:
DELETE FROM P1
USING Photos P1, Photos P2
WHERE P1.id > P2.id
AND P1.merchant_id = P2.merchant_id
AND P1.url = P2.url;