16

Nel nostro sistema eseguiamo importazioni orarie da un database esterno. A causa di un errore negli script di importazione, ora ci sono alcuni record duplicati.Elimina record duplicati in base a più colonne

Un duplicato si considera quando qualsiasi record ha lo stesso :legacy_id e :company.

Quale codice è possibile eseguire per trovare ed eliminare questi duplicati?

stavo giocando in giro con questo:

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

Sembrava di restituire alcuni dei duplicati, ma non ero sicuro di come eliminare da lì?

Qualche idea?

+1

http://stackoverflow.com/questions/14124212/remove-duplicate-records-based-on- più colonne questo aiuta? – argentum47

+0

Che ha funzionato alla grande @ argentum47 non posso credere di averlo perso mentre stavo navigando – bnussey

risposta

12

È possibile provare il seguente approccio:

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

O pura sql:

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