首页 文章

使用PostgreSQL查找重复的行

提问于
浏览
63

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

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

3 回答

  • 110

    这是我的看法 .

    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小提琴=> http://sqlfiddle.com/#!15/d6941/1/0


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

  • 6

    sgeddes的第二部分_1169715_ t在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;
    
  • 8

    我看到了几个选项 .

    要快速执行此操作,请使用类似的内容(假设您的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;
    

    Fiddle .

相关问题