回答

收藏

删除基于多列的重复记录

技术问答 技术问答 295 人阅读 | 0 人回复 | 2023-09-14

在我们的系统中,我们每小时从外部数据库导入一次。由于导入脚本中的错误,现在有一些重复的记录。# p) Y+ Q% [/ j
如果任何记录具有:legacy_id和,则视为重复:company。' Z2 a7 D8 M! i' H3 d& f* C$ O; ~( x; @
我可以运行什么代码来查找和删除这些重复项?
" B( ^% V7 |6 I. a. h3 C5 v* U我在玩这个:7 g$ k/ n; O$ T: `3 T; q
Product.select(:legacy_id,:company).group(:legacy_id,:company).having("count(*) > 1")  f  U9 _( ]7 E) g+ W/ v
它似乎返回了一些重复项,但是我不确定如何从那里删除?
  X2 U5 H4 s0 n; c) F有任何想法吗?& H+ T# C8 i4 I( E% i; x  B
                / d& N( n3 H4 ~' t
解决方案:
# y& d( r9 I! }7 }/ b, \                3 K' d: E/ U1 [: c, H7 P

4 S5 b( O9 i7 Q0 u9 I2 `6 m' p, ~; w2 L  w1 J+ o
                您可以尝试以下方法:9 T( g& P8 K1 g. z/ X
Product.where.not(
4 N% F' v+ }$ i, w  id: Product.group(:legacy_id, :company).pluck('min(products.id)')
% V7 |" L) k/ D; {& v" m).delete_all
: e9 g0 B/ \$ Y: m9 |2 K还是纯sql:
: I8 q- B3 S& W; Vdelete from products$ w) C. S; `" v2 @$ v
where id not in (
: n6 k' `: D9 N" r5 d5 j+ W   select min(p.id) from products p group by p.legacy_id, p.company: k+ ~, U# W2 U0 u/ g4 Z" ~
)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则