74

We have a table of photos with the following columns:

id, merchant_id, url 

this table contains duplicate values for the combination merchant_id, url. so it's possible that one row appears more several times.

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

What is the best way to delete those duplications? (I use PostgreSQL 9.2 and 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

削除するレコードを仕様に合わせて調整するために、注文を自由に試してみてください。

SQLフィドル=> http://sqlfiddle.com/#!15/d6941/1/0


Postgres9.2のSQLFiddleはサポートされなくなりました。SQLFiddleをpostgres9.3に更新する

于 2013-01-23T03:21:31.640 に答える
10

sgeddesの回答の2番目の部分は、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

いくつかの選択肢があります。

これをすばやく行うには、次のようなものを使用します(上記で234について何度も言及しているため、ID列は一意ではないと想定しています)。

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 に答える