Вы можете сделать это через самостоятельные соединения. Я бы сделал это в несколько этапов - от лучшего до самого слабого матча.
Итак, если предположить, что schoolID является надежным в момент его появления, вы найдете дубликаты следующим образом:
select *
from dat parent,
dat child
where parent.id <> child.id
and parent.schoolid = child.schoolid
(Извинения за допотопный синтаксис соединения).
Запустите это, и посмотрите, есть ли у вас странности; если вам это нравится, включите его в обновление. Обновления с самостоятельным объединением в MySQL немного болезненны, и самый простой способ - создать представление для объединения.
create view dupes as
select min(parent.id) as uniqueid, child.id
from dat parent,
dat child
where parent.schoolid = child.schoolid
group by child.id
update ignore dat, dupes
set dat.uniqueid = dupes.uniqueid
where dat.id = dupes.id
Теперь вы переходите ко второй самой сильной ссылке, что-то вроде:
select *
from dat parent,
dat child
where parent.id <> child.id
and parent.uniqueID is null
and child.uniqueID is null
and parent.forename = child.forename
and parent.surname = child.surname
and parent.dob = child.dob
Опять же, запустите его, проверьте данные на странности, превратитесь в оператор обновления.
Далее, ослабьте ограничения - это нормально, если мы ранее сопоставили родительский элемент с другой записью, поэтому мы можем убрать проверку на null:
select *
from dat parent,
dat child
where parent.id <> child.id
and child.uniqueID is null
and parent.forename = child.forename
and parent.surname = child.surname
and parent.dob = child.dob
И так далее, и так далее.
Работая с наибольшей вероятностью, вы уменьшаете риск довольно незначительного сходства, переопределяющего четкую связь (например, два человека по имени «Ким», родившиеся в 1978-10-24,
Запустив сначала выбор, а затем превратив их в обновления, вы избежите человеческой ошибки.