Самый быстрый SQL-скрипт "Get Duplicates" - PullRequest
43 голосов
/ 13 октября 2008

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

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

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

Ответы [ 5 ]

78 голосов
/ 13 октября 2008

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

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1
16 голосов
/ 13 октября 2008

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

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);
5 голосов
/ 21 января 2011

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

delete from MyTable where MyTableID in (
  select max(MyTableID)
  from MyTable
  group by Thing1, Thing2, Thing3
  having count(*) > 1
)
5 голосов
/ 13 октября 2008

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

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

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

Есть три вида ответов:

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

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

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

3 голосов
/ 21 августа 2012

Это должно быть достаточно быстро (даже быстрее, если 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(*), вы не можете проверить количество раз , оно дублируется, только то, что оно появляется более одного раза .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...