我们有一个包含以下列的照片表:
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。
的看法。
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 Fiddle
for Postgres 9.2 不再受支持;将 SQL Fiddle 更新到 postgres 9.3
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;
我看到几个选项给你。
为了快速做到这一点,请使用这样的东西(它假设你的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;
还有小提琴。