Utiliser une clause LIKE dans une partie d'un INNER JOIN
Peux/dois-je utiliser COMME critères dans le cadre d'une JOINTURE INTERNE lors de la construction d'une procédure stockée/requête? Je ne suis pas sûr que je suis de se poser les bonnes chose, laissez moi vous expliquer.
Je suis de créer une procédure qui va prendre une liste de mots-clés pour la recherche dans une colonne qui contient du texte. Si j'étais assis à la console, j'avais l'exécuter en tant que tel:
SELECT Id, Name, Description
FROM dbo.Card
WHERE Description LIKE '%warrior%'
OR
Description LIKE '%fiend%'
OR
Description LIKE '%damage%'
Mais un truc que j'ai ramassé un peu de temps aller à faire "fortement typé" liste de l'analyse dans une procédure stockée est d'analyser la liste dans une variable de table/table temporaire, de la convertir dans le type approprié et ensuite de faire une JOINTURE INTERNE sur la table dans mon dernier jeu de résultats. Cela fonctionne très bien lors de l'envoi de dire une liste de integer Id de la procédure. Je me retrouve à avoir une dernière requête qui ressemble à ceci:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId
Je veux utiliser cette astuce avec une liste de chaînes de caractères. Mais depuis que je suis à la recherche pour un mot clé particulier, je vais utiliser la clause LIKE. Donc, idéalement, je pense que j'aurais ma dernière requête ressembler à ceci:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'
Est-ce possible/recommandé?
Est-il une meilleure façon de faire quelque chose comme cela?
La raison pour laquelle je suis en train de mettre des caractères génériques sur les deux extrémités de la clause est parce qu'il y a "diablotin", "la bête-guerrier", "directe-dommages" et "bataille des dommages", des termes qui sont utilisés dans la carte de textes.
Je reçois l'impression qu'en fonction de la performance, je peux soit utiliser la requête que j'ai précisé ou de l'utilisation d'un plein-texte recherche par mot-clé pour accomplir la même tâche?
Autre que d'avoir le serveur de faire un index de texte dans les champs, je veux de la recherche de texte, est-il autre chose que je dois faire?
source d'informationauteur Dillie-O
Vous devez vous connecter pour publier un commentaire.
Votre première requête fonctionne, mais nécessitera un full table scan en raison d'un index sur cette colonne sera ignoré. Vous allez également avoir à faire quelques SQL dynamique pour générer toutes vos COMME des clauses.
Essayer une recherche en plein texte si votre utilisation de SQL Server ou consultez l'un de l' Lucene implémentations. Joël a parlé de son succès avec elle récemment.
Essayer cette
Cette pratique n'est pas l'idéal. À utiliser avec prudence.
Il semble que vous êtes à la recherche pour la recherche de texte intégral. Parce que vous voulez interroger un ensemble de mots-clés à l'encontre de la description de la carte et de trouver tous les coups? - Il Correct?
Personnellement, je l'ai fait avant, et cela a bien fonctionné pour moi. Les seuls problèmes que j'ai pu voir est peut-être des problèmes avec une colonne indexée, mais je pense que vous auriez le même problème avec une clause where.
Mon conseil pour vous est il suffit de regarder les plans d'exécution entre les deux. Je suis sûr qu'il va différer lequel est le mieux selon la situation, comme tous les bons problèmes de programmation.
@Dillie-O
Quelle est la taille de ce tableau?
Quel est le type de données de champ de Description?
Si sont de petits une recherche en plein texte sera excessif.
@Dillie-O
Peut-être pas la réponse que vous où regarder pour, mais je serais partisan d'un changement de schéma...
proposé schéma:
Cela vous permettra d'utiliser les index sans avoir à mettre en œuvre un boulon sur la solution, et conserve vos données atomiques.
connexes: Recommandé de base de données SQL conception des étiquettes ou des étiquettes
Je pense que ce qui vous fait peut-être allusion ici est de mettre les mots-clés à inclure dans une table, puis utiliser relationnel division de trouver des correspondances (on pourrait aussi utiliser une autre table pour les mots à exclure). Pour un exemple en SQL voir Des Recherches par mot clé par Joe Celko.
essayer...
Sa fonctionne pour moi.:-)
Performance dépend du serveur que vous utilisez, et sur le schéma de données, et la quantité de données. Les dernières versions de MS SQL Server, que la requête devrait fonctionner très bien (MS SQL Server 7.0 eu des problèmes avec cette syntaxe, mais il a été adressé dans le service pack 2).
Avez-vous exécuter ce code par l'intermédiaire d'un générateur de profils? Si la performance est assez rapide et les données d'index appropriés en place, vous devriez être tous ensemble.
LIKE '%fiend% "sera de ne jamais utiliser de chercher, COMME le" démon%. Simplement une recherche de génériques n'est pas sargable
Essayer ce;