Ваше сравнение, как уже отмечалось, потребует декартовой ... но только частичной. Так как вы требуете значения в полях вашего имени и фамилии, у меня будет индекс по крайней мере по имени, имени. Затем добавьте предложение WHERE в ваше условие только для части фамилии ... скажем, первые 2-3 символа. Таким образом, он будет только декартовым по отношению к тем же префиксам, что и остальные. Нет смысла сравнивать «Билла Джонса» с «Тоней Смит». Тем не менее, вы можете быть заинтересованы в "Билл Джонс" против "Уильям Джонс" по общему адресу, городу и / или электронной почте. Рассмотрим следующие части имени для декартового сравнения.
(names fictitious for sample)
ID Last First
1 Adams Brian
2 Adams Marsha
3 Andrews Jeff
4 Brown Steve
5 Johns Dave
6 Johnson Bill
7 Johnson William
Оба «Адамса» будут сравниваться, если вы укажете только 3 левых каждой фамилии в предложении where. «Эндрюс» и «Браун» не могут сравниться ни с кем другим. Тогда 3, начинающиеся с "Джо", будут проверены на декартову ...
Теперь добавьте еще одно значение MORE к предложению where ... Поскольку у вас есть столбец ID, убедитесь, что он тоже является частью предложения where. Где ID второй таблицы ВСЕГДА больше, чем та, на которой вы находитесь. Пример: при сравнении имен "Адамс". Вы уже будете знать, если ID1 сравнивался с ID2 как дубликат или нет (в данном случае нет), так зачем возвращаться назад и повторно сравнивать ID2 с ID1.
Итак, эта выборка из 7 записей приведет к сравнению
1-2
2-no more to compare against
3-no more to compare against
4-no more to compare against
5-6
5-7
6-7
7-no more to compare against
Таким образом, в конечном итоге будет что-то вроде (включая идентификатор, который был близким совпадением, в качестве основы для просмотра.) Вы можете даже получить все столбцы как «MatchFirstName, MatchLastName, MatchCity и т. Д.» Только для предварительного просмотра. ..)
SELECT
originalTable.id,
originalTable.lastname,
originalTable.firstname,
originalTable.address,
originalTable.city,
originalTable.email,
compareTable.ID as MatchID
FROM
address as originalTable,
address as compareTable
WHERE
originalTable.ID < CompareTable.ID
AND left( originalTable.LastName, 3 ) = left( CompareTable.LastName, 3 )
AND (originalTable.firstname = compareTable.firstname)
+ (originalTable.lastname = compareTable.lastname)
+ (originalTable.address = compareTable.address and originalTable.address != '')
+ (originalTable.city = compareTable.city and originalTable.city != '')
+ (originalTable.email = compareTable.email and originalTable.email != '') >= 3