Поиск повторяющихся записей в SQL на основе комбинации полей

У меня есть проект, в котором значительная часть пирога будет заключаться в том, чтобы определить, где запись дублируется в базе данных (Sql Server 2005). Я знаю очевидные способы найти дубликат записи. Однако в этом случае мы хотим быть достаточно умными в этом процессе. Таблица (таблицы) будет содержать информацию о потенциальном клиенте (лиде). Начальные столы будут принимать все лиды. Затем мы пройдем процесс дублирования, который проверит, является ли лид дубликатом, сопоставив несколько полей. Например, мы можем захотеть сопоставить фамилию, имя, адрес электронной почты и почтовый индекс. Это всего лишь пример, но по сути мы хотим создать ключ, используя различные поля, чтобы знать, существует ли этот человек. Записи, не являющиеся дубликатами, попадут в финальную таблицу.

Я хотел бы использовать SSIS для этого, но я не уверен, что это лучший способ использовать SSIS для этого. Может ли кто-нибудь направить меня в правильном направлении или предоставить ссылку на пример, который использует SSIS для борьбы с дубликатами путем проверки комбинации полей?


person user69889    schedule 16.03.2009    source источник


Ответы (3)


Мне кажется, вы пытаетесь перехитрить своих пользователей, пытаясь угадать их. К сожалению, это почти всегда никогда не работает, так как у вас действительно могут быть два клиента с одинаковым именем, но разными почтовыми индексами или другими подобными примерами.

Лучше всего «предположить», что клиент, которого они собираются сохранить, уже существует (и показать ему дубликат), но все равно позволить ему сохраниться. Таким образом, процесс, вероятно, должен выглядеть так:

  1. Пользователь вводит информацию и нажимает Сохранить
  2. Система обнаруживает потенциальный дубликат, используя критерии, и предлагает пользователю
  3. Пользователь либо отменит, либо подтвердит, после чего вы предпримете соответствующие действия.

Если потенциального дубликата нет, то шаги 2-3 можно смело пропустить.

person hova    schedule 16.03.2009
comment
На ум приходит: программирование сегодня — это гонка между инженерами-программистами, стремящимися создавать большие и лучшие программы, защищающие от идиотов, и Вселенной, пытающейся производить больших и лучших идиотов. Пока Вселенная побеждает. -- Рик Кук, The Wizardry Compiled - person marc_s; 17.03.2009
comment
Это то, что я сделал в одном из наших веб-приложений, и это работает очень хорошо. - person WakeUpScreaming; 17.03.2009

-- List all Duplicates
select m1.lastname, m1.firstname, m1.email, m1.zipcode
from tblMain m1
inner join tblMain m2
on isnull(m1.lastname, '') = isnull(m2.lastname, '')
and isnull(m1.firstname, '') = isnull(m2.firstname, '')
and isnull(m1.email, '') = isnull(m2.email, '')
and isnull(m1.zipcode, '') = isnull(m2.zipcode)
and m1.ID <> m2.ID
order by 1, 2, 3, 4

Чтобы удалить последние дубликаты, используйте что-то вроде:

delete from tblMain
where ID in 
(
    select m1.ID
    from tblMain m1
    inner join tblMain m2
    on isnull(m1.lastname, '') = isnull(m2.lastname, '')
    and isnull(m1.firstname, '') = isnull(m2.firstname, '')
    and isnull(m1.email, '') = isnull(m2.email, '')
    and isnull(m1.zipcode, '') = isnull(m2.zipcode)
    and m1.ID > m2.ID
)
person Gordon Bell    schedule 16.03.2009

Я не понимаю, как вы можете быть уверены, что SSIS — это решение вашей проблемы. Почему вы не можете просто создать уникальные ключи в своей «окончательной» таблице, чтобы убедиться, что вы не добавляете дубликаты? Возможно, вы должны объяснить свою проблему лучше...

person Sam    schedule 16.03.2009