SQL для обнаружения похожих записей в одной таблице базы данных - PullRequest
0 голосов
/ 13 октября 2010

У меня есть требование циклически проходить через записи в таблице базы данных и группировать элементы, которые имеют похожее содержимое. Я хочу сопоставить один столбец в базе данных, и если есть похожие записи, я хочу извлечь идентификатор каждой строки и сохранить его в другой таблице, например. если бы у меня было 10 похожих строк, они были бы связаны с одной «заголовочной» записью в другой таблице.

Ниже приведен простой псевдокод для иллюстрации того, что мне нужно сделать:

For Each record in table

     If There is a similar record in header table Then
      Link this record to matching header table record 
     Else
      Create new Header record and link this record
     End If

End For

Я использую MSSQL 2008 с полнотекстовым поиском, который предоставит мне механизм, который мне нужен для выбора похожих записей. В настоящее время я планирую создать цикл C в коде C # и выполнить сопоставление и сохранение в SQL, вызвав хранимую процедуру для проверки на соответствие записи.

Что-то говорит мне, что все это должно быть сделано в одной хранимой процедуре (а что-то еще говорит мне сохранять логику в коде!).

Есть ли более аккуратный способ сделать это в SQL?

Ответы [ 4 ]

1 голос
/ 13 октября 2010

Базы данных действительно хороши для работы с различными частями информации.Они не так хороши в работе с квазиразличимой информацией.

С учетом сказанного, посмотрите, работает ли soundex function (достаточно хорошо) для группировки аналогичных входных данных.

И, ради бога, не используйте что-нибудь как это в производственной среде.

0 голосов
/ 13 октября 2010

Возможно, вы захотите взглянуть на оператор MERGE , новый в SQL Server 2008. См., Например: Вставка, обновление и удаление данных с помощью MERGE .

0 голосов
/ 13 октября 2010

вы можете написать sproc и запланировать выполнение плана обслуживания, или вы можете использовать встроенный код c # на сервере sql, чтобы вы могли легко создавать лучшие алгоритмы на стороне db с помощью c #.или вы можете написать службу Windows для задания пакетной обработки, которое может выполняться регулярно.

0 голосов
/ 13 октября 2010

Вот пример .. попробуйте изменить его в соответствии с вашими потребностями.

SELECT email, 
 COUNT(email) AS NumOccurrences
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...