使用PostgreSQL查找重复的行

sch*_*bbi 68 sql database duplicates ruby-on-rails-3 postgresql-9.2

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

id, merchant_id, url 
Run Code Online (Sandbox Code Playgroud)

此表包含组合的重复值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
Run Code Online (Sandbox Code Playgroud)

删除这些重复的最佳方法是什么?(我使用PostgreSQL 9.2和Rails 3.)

Mat*_*ewJ 120

这是我的看法.

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
Run Code Online (Sandbox Code Playgroud)

您可以随意使用订单来定制要删除的记录到您的规范.

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


不再支持Postgres 9.2的SQL Fiddle; 将SQL Fiddle更新为postgres 9.3

  • 这就像一个魅力,但如何删除使用此查询找到的重复项? (3认同)

111*_*01b 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;  
Run Code Online (Sandbox Code Playgroud)


sge*_*des 6

我看到了几个选项.

要快速执行此操作,请使用类似的内容(假设您的ID列不是唯一的,因为您多次提到234次):

CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos;
DROP TABLE Photos;
ALTER TABLE tmpPhotos RENAME TO Photos;
Run Code Online (Sandbox Code Playgroud)

这是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;  
Run Code Online (Sandbox Code Playgroud)

小提琴.

  • 在我的情况下,id是唯一的.我在我的示例代码中做错了.但如果我尝试使用你的第二个解决方案,我会收到错误.`ERROR:关系"p1"不存在 (2认同)