2010-08-10 5 views
2

J'ai un problème avec la comparaison de deux tables dans SQL Server.SQL Server: comment comparer deux tables

J'ai la première table [Table1] avec la colonne de texte où je stocke mon contenu et la deuxième table [table2] avec la colonne de mes mots-clés.

Et maintenant je veux comparer tous mes mots-clés par rapport à mon contenu et obtenir une liste de mots-clés avec le nombre d'occurrences dans le contenu. (assez clair?)

+2

Activer la recherche en texte intégral? –

+1

Tout d'abord, si vous utilisez SQL Server 2005 ou version ultérieure, supprimez la colonne TEXT et utilisez plutôt VARCHAR (MAX) (ou NVARCHAR (MAX)). –

+0

Les mots-clés sont stockés dans la colonne NAVCHAR (255), mais le contenu dans ntext et je ne peux pas changer cela. Je vais exécuter la requête une fois seulement - besoin de ces données pour notre gars SEO. – giker

Répondre

0

Cela vous retournera la liste des ID de Table1 (id int, txt ntext) avec les clés de Table2 (kwd nvarchar (255)) qui existent dans le champ ntext. Nombre d'occurrences est difficile et vous devrez écrire UDF, préférable CLR un, pour l'obtenir. J'ai défini le mot comme tout ce qui est séparé par l'espace ou par parenthèse ouverte de gauche et d'espace, parenhesize proche, virgule, point ou point-virgule de droite. Vous pouvez ajouter d'autres conditions, par exemple des guillemets, des guillemets, etc.

Select Table1.id, Table2.kwd 
    From Table1 
Cross Join Table2 
Where patindex(N'%[ (]'+Table2.kwd+N'[ ,.;)]%',N' '+cast(Table1.txt as nvarchar(max))+N' ')>0 
Order by id, kwd 
+0

et comment obtenir le nombre d'occurrences de chaque mot-clé? –

+0

Ceci tue ma base de données - pour les 10 premiers temps d'exécution atteignent 9 minutes :) Vous avez écrit: "J'ai défini le mot comme étant tout ce qui est séparé par l'espace ou entre parenthèses ouvertes de gauche et d'espace" Mais, chaque mot clé est une ligne Tableau 2 – giker

+0

Il s'agit d'une requête lourde car elle doit faire une jointure croisée entre les mots-clés et les tables de texte et doit également effectuer une fonction patindex qui n'est pas champion de la vitesse. Quand j'ai dit "J'ai défini le mot comme ..." je veux dire comment définissez-vous le mot dans votre champ ntext parce que je ne sais pas si les mots sont délimités par des espaces, délimités par des tabulations, délimités par des tabulations ou par des mots pourrait avoir une combinaison de délimiteurs. Quoi qu'il en soit, si vous avez SQL 2008, utilisez la solution proposée par Martin Smith (ci-dessous), même si cela prendrait beaucoup de ressources aussi. – Niikola

2

Quelle version de SQL Server? Si SQL2008 vous pouvez le faire (probablement après la coulée du texte à nvarchar(max))

WITH Table1 AS 
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL 
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL 
SELECT 3, N'red lorry yellow lorry' UNION ALL 
SELECT 4, N'the quick brown fox jumped over the lazy dog' 
), 
Table2 AS 
(
SELECT 'lorry' as keyword UNION ALL 
SELECT 'yellow' as keyword UNION ALL 
SELECT 'brown' as keyword 
) 

SELECT Table1.id,display_term, COUNT(*) As Cnt 
FROM Table1 
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0) 
JOIN Table2 t2 ON t2.keyword=display_term 
WHERE TXT IS NOT NULL 
GROUP BY Table1.id,display_term 
ORDER BY Cnt DESC 

Retours

id   display_term     Cnt 
----------- ------------------------------ ----------- 
3   lorry       2 
3   yellow       1 
4   brown       1 
1   brown       1 
+0

Wow, j'ai raté la fonction sys.dm_fts_parser et c'est génial – Niikola

+0

Merci pour ça, mais je ne peux pas l'exécuter. Je reçois: "Argument de type de données ntext est invalide pour l'argument 1 de remplacer" fonction ". – giker

+0

passer' cast (YourColumnName comme nvarchar (max)) 'à la fonction de remplacement –

Questions connexes