Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PostgreSQL查找重复行_Sql_Database_Ruby On Rails 3_Duplicates_Postgresql 9.2 - Fatal编程技术网

使用PostgreSQL查找重复行

使用PostgreSQL查找重复行,sql,database,ruby-on-rails-3,duplicates,postgresql-9.2,Sql,Database,Ruby On Rails 3,Duplicates,Postgresql 9.2,我们有一个包含以下列的照片表: id, merchant_id, url 此表包含组合商户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

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

id, merchant_id, url 
此表包含组合
商户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。)

我为您提供了几个选项

要快速完成此操作,请使用类似的方法(假设您的ID列不是唯一的,正如您在上面多次提到234):

这是你的电话号码

如果有约束,则需要将约束添加回表中

如果您的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;  

这是我对它的看法

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
请随意使用order by,根据您的规格定制您要删除的记录

SQL Fiddle=>



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

sgeddes回答的第二部分在postgres上不起作用(Fiddle使用MySQL)。以下是他使用Postgres的答案的更新版本:


您的ID列是唯一的吗?我看了234 3次,但你说你的商户id和url是重复的值。很抱歉,可能重复。上面示例中的id应该是唯一的。谢谢你的正确编辑。这里的解决方案stackoverflow.com/questions/1746213/…不适用于我的案例。id在我的案例中是唯一的。我只是在我的示例代码中做错了。但是如果我尝试使用你的第二个解决方案,我会出错<代码>错误:关系“p1”不存在@StefanSchmidt我将其改为在Postgres上运行而不是在MySQL上运行:这就像一个符咒,但如何删除使用此查询找到的重复项?如果我们将相同的内容重复3次,则结果为take 2和take 3。我怎么解决呢?你想做什么还不清楚;提供的答案显示了如何使用SQLFIDLE链接根据定义的列删除行。您可能应该提出一个新问题,并给出具体的重现步骤。您能否通过
ROW\u NUMBER()OVER(按商户Id划分,按Id排序的url asc)
不,它不会,这正是您检查rows>1的原因。请看sql小提琴。
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
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;