基于多列删除重复记录

19

在我们的系统中,我们每小时从外部数据库进行导入。由于导入脚本中出现错误,现在存在一些重复记录。

如果任何记录具有相同的:legacy_id:company,则被视为重复。

我可以运行什么代码来查找并删除这些重复项?

我尝试了以下代码:

Product.select(:legacy_id,:company).group(:legacy_id,:company).having("count(*) > 1")

看起来它返回了一些重复的内容,但我不确定如何从中删除?

有任何想法吗?


1
这个有帮助吗?https://dev59.com/1GYq5IYBdhLWcg3w4EZx - argentum47
那太好了,@argentum47。当我浏览时,真不敢相信我错过了那个。 - bnussey
1个回答

19

您可以尝试以下方法:

Product.where.not(
  id: Product.group(:legacy_id, :company).pluck('min(products.id)')
).delete_all

或者纯 SQL:

delete from products
where id not in ( 
   select min(p.id) from products p group by p.legacy_id, p.company
)

1
如果您还想删除相关记录,请使用destroy_all而不是delete_all - Sami Birnbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接