2010-10-12 6 views
0

J'ai besoin d'une boucle dans les enregistrements d'une table de base de données et d'éléments de groupe ayant un contenu similaire. Je veux faire correspondre sur une seule colonne dans la base de données et s'il y a des enregistrements similaires, je veux extraire l'ID de chaque ligne et l'enregistrer dans une autre table, par exemple. Si j'avais 10 lignes similaires, elles seraient liées à un enregistrement "en-tête" dans une autre table.SQL pour détecter des enregistrements similaires dans la même table de base de données

est Ci-dessous quelques pseudocode simple pour illustrer ce que je dois faire:

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 

J'utilise MSSQL 2008 avec recherche de texte intégral qui me fournira le mécanisme que je dois choisir des dossiers similaires. Au moment où je prévois de créer la boucle quatre dans C# Code et faire la correspondance et l'enregistrement dans SQL en appelant une procédure stockée pour vérifier l'enregistrement correspondant. Quelque chose me dit que tout devrait être fait dans une seule procédure stockée (et quelque chose d'autre me dit de garder la logique dans le code!).

Existe-t-il une façon plus simple de le faire en SQL?

Répondre

0

Voici un example ..try en fonction de vos besoins.

SELECT email, 
COUNT(email) AS NumOccurrences 
FROM users 
GROUP BY email 
HAVING (COUNT(email) > 1) 
+0

merci pour l'exemple, mais dans cet exemple, il ne fonctionnerait que sur les doublons exacts. J'ai besoin de vérifier les enregistrements similaires qui ne sont peut-être pas exactement les mêmes. – BradB

+0

vous pourriez ajouter à la clause having une autre condition 'OR email LIKE '% similar%'' pour vérifier les éléments similaires .. – Vishal

+0

Je prévois d'utiliser FTS car l'opérateur LIKE n'est pas assez sophistiqué pour mes besoins. Avez-vous déjà utilisé un FTS JOIN dans le style de votre exemple? Faisable? – BradB

0

Vous pouvez écrire un sproc et planifier l'exécution d'un plan de maintenance, ou vous pouvez utiliser le code C# intégré sur le serveur SQL, de sorte que vous puissiez facilement créer de meilleurs algorithmes du côté db avec C#. ou vous pouvez écrire un service Windows pour un travail de traitement par lots qui peut fonctionner régulièrement.

1

Les bases de données sont très efficaces pour traiter des informations distinctes. Ils ne sont pas très bons pour traiter des informations quasi-distinctes. Cela dit, voir si le soundexfunction fonctionne (assez bien) pour regrouper des entrées similaires. Et, pour l'amour de Dieu, n'utilisez pas comme comme ceci dans un environnement de production.

Questions connexes