Использование sql для поиска дублирующихся записей и удаления в той же операции - PullRequest
2 голосов
/ 25 мая 2011

Я использую этот оператор SQL для поиска дублирующихся записей:

  SELECT id, 
         user_id, 
         activity_type_id, 
         source_id, 
         source_type, 
         COUNT(*) AS cnt
    FROM activities
GROUP BY id, user_id, activity_type_id, source_id, source_type
  HAVING COUNT(*) > 1

Однако я хочу не только найти, но и удалить в той же операции.

1 Ответ

1 голос
/ 25 мая 2011

delete from activities where id not in (select max(id) from activities group by ....)


Благодаря @OMG Ponies и его другому посту здесь пересмотренное решение (но не совсем то же самое). Здесь я предположил, что не имеет значения, какие конкретные строки остаются неосуществленными. Также предполагается, что id является первичным ключом.

В моем примере я просто настроил один дополнительный столбец name для тестирования, но его можно легко расширить на несколько столбцов с помощью предложения GROUP BY.

DELETE a FROM activities a 
   LEFT JOIN (SELECT MAX(id) AS id FROM activities GROUP BY name) uniqId 
   ON a.id=uniqId.id WHERE uniqId.id IS NULL;
...