Ответ 1
Это более прямой способ:
select afield1,count(afield1) from atable
group by afield1 having count(afield1) > 1
Что такое пример быстрого SQL для получения дубликатов в наборах данных с сотнями тысяч записей. Обычно я использую что-то вроде:
SELECT afield1, afield2 FROM afile a
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);
Но это довольно медленно.
Это более прямой способ:
select afield1,count(afield1) from atable
group by afield1 having count(afield1) > 1
Вы можете попробовать:
select afield1, afield2 from afile a
where afield1 in
( select afield1
from afile
group by afield1
having count(*) > 1
);
Аналогичный вопрос был задан на прошлой неделе. Там есть хорошие ответы.
SQL для поиска повторяющихся записей (внутри группы)
В этом вопросе OP интересовался всеми столбцами (полями) в таблице (файле), но строки принадлежали одной группе, если они имели одинаковое значение ключа (afield1).
Существует три типа ответов:
подзапросы в предложении where, как и некоторые другие ответы здесь.
внутреннее соединение между таблицей и группами, рассматриваемыми как таблица (мой ответ)
и аналитические запросы (что-то новое для меня).
Кстати, если кто-то хочет удалить дубликаты, я использовал это:
delete from MyTable where MyTableID in (
select max(MyTableID)
from MyTable
group by Thing1, Thing2, Thing3
having count(*) > 1
)
Это должно быть достаточно быстро (даже быстрее, если индексы 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(*)
, вы не можете проверить количество повторений, только то, что оно появляется более одного раза.