74

我们有一张包含以下列的照片表:

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。)

4

3 回答 3

131

这是我的看法。

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

随意使用 order by 以根据您的规范定制要删除的记录。

SQL 小提琴 => http://sqlfiddle.com/#!15/d6941/1/0


不再支持用于 Postgres 9.2 的 SQL Fiddle;将 SQL Fiddle 更新到 postgres 9.3

于 2013-01-23T03:21:31.640 回答
10

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;  
于 2015-03-10T21:14:06.480 回答
6

我为你看到了几个选择。

为了快速执行此操作,请使用类似这样的方法(假设您的 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;  

还有小提琴

于 2013-01-23T02:50:59.813 回答