2013-01-23 22 views
59

我們有照片的表有以下欄目:查找重複的行與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.)

+1

你的ID列是唯一的嗎?我看到234次3次,但你說你的merchant_id和url是重複的值。 – sgeddes

+0

可能的重複http://stackoverflow.com/questions/1746213/how-to-delete-duplicate-entries-in-postgresql – 2013-01-23 02:51:31

+0

抱歉的混淆。上例中的id應該是唯一的。感謝您的正確編輯。這裏的解決方案stackoverflow.com/questions/1746213/...不適用於我的情況。 –

回答

105

這是我的承擔。

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


SQL小提琴爲9.2的Postgres不再支持;將SQL Fiddle更新爲postgres 9.3

+2

這很像一個魅力,但是你怎麼樣刪除使用此查詢找到的重複項? –

+1

請注意 http://sqlfiddle.com/#!12/796d6/133 – MatthewJ

+0

如果我們有同樣的事情重複3次,採取2並採取3結果。我該如何解決它? –

6

我看到了幾個選項。

對於這樣做的快捷方式,使用這樣的(它假定你提到234以上的多次的ID列不是唯一的):

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

+2

該ID在我的情況下是獨一無二的。我在我的示例代碼中犯了錯誤。但如果我嘗試使用第二種解決方案,則會出現錯誤。 '錯誤:關係「p1」不存在' –

+0

@StefanSchmidt我修復了它在Postgres而不是MySQL上運行的問題:http://sqlfiddle.com/#!12/6b1a7/1 – 11101101b

8

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;