Pytanie Usuń zduplikowane rekordy na podstawie wielu kolumn


W naszym systemie prowadzimy import godzinowy z zewnętrznej bazy danych. Z powodu błędu w skryptach importowania, istnieje teraz kilka zduplikowanych rekordów.

Duplikat uważa się za miejsce, w którym jakikolwiek rekord ma to samo :legacy_id i :company.

Jaki kod mogę uruchomić, aby znaleźć i usunąć te duplikaty?

Bawiłem się z tym:

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

Wydawało się, że zwraca niektóre z duplikatów, ale nie byłem pewien, jak usunąć stamtąd?

Jakieś pomysły?


16
2017-11-28 13:30


pochodzenie


stackoverflow.com/questions/14124212/... to pomaga? - argentum47
To działało świetnie @ argentum47 nie mogę uwierzyć, że przeoczyłem to podczas przeglądania - bnussey


Odpowiedzi:


Możesz wypróbować następujące podejście:

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

Lub czysty sql:

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

12
2018-02-08 01:44