Подтвердить что ты не робот

Самый быстрый "Получить дубликаты" SQL script

Что такое пример быстрого SQL для получения дубликатов в наборах данных с сотнями тысяч записей. Обычно я использую что-то вроде:

SELECT afield1, afield2 FROM afile a 
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);

Но это довольно медленно.

4b9b3361

Ответ 1

Это более прямой способ:

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1

Ответ 2

Вы можете попробовать:

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);

Ответ 3

Аналогичный вопрос был задан на прошлой неделе. Там есть хорошие ответы.

SQL для поиска повторяющихся записей (внутри группы)

В этом вопросе OP интересовался всеми столбцами (полями) в таблице (файле), но строки принадлежали одной группе, если они имели одинаковое значение ключа (afield1).

Существует три типа ответов:

подзапросы в предложении where, как и некоторые другие ответы здесь.

внутреннее соединение между таблицей и группами, рассматриваемыми как таблица (мой ответ)

и аналитические запросы (что-то новое для меня).

Ответ 4

Кстати, если кто-то хочет удалить дубликаты, я использовал это:

delete from MyTable where MyTableID in (
  select max(MyTableID)
  from MyTable
  group by Thing1, Thing2, Thing3
  having count(*) > 1
)

Ответ 5

Это должно быть достаточно быстро (даже быстрее, если индексы dupeFields индексируются).

SELECT DISTINCT a.id, a.dupeField1, a.dupeField2
FROM TableX a
JOIN TableX b
ON a.dupeField1 = b.dupeField2
AND a.dupeField2 = b.dupeField2
AND a.id != b.id

Я предполагаю, что единственным недостатком этого запроса является то, что, поскольку вы не выполняете COUNT(*), вы не можете проверить количество повторений, только то, что оно появляется более одного раза.