用PostgreSQL查找重复的行

我们有以下列的照片表格:

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)

这是我的承担。

 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 

随意玩订单,按照您的要求定制要删除的logging。

SQL Fiddle => http://sqlfiddle.com/#!15/d6941/1/0


Postgres 9.2的SQL小提琴不再支持; 更新SQL小提琴到Postgres 9.3

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; 

我看到了几个选项给你。

要做到这一点,请使用类似的东西(假设您的ID列不是唯一的,因为您提到234多次):

 CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos; DROP TABLE Photos; ALTER TABLE tmpPhotos RENAME TO Photos; 

这是SQL小提琴 。

如果有的话,您需要将约束添加回表格。

如果你的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; 

和小提琴 。