J'ai besoin de rechercher des personnes dont le prénom est inclus (une sous-chaîne de) dans le prénom de quelqu'un d'autre.
SELECT DISTINCT top 10 people.[Id], peopleName.[LastName], peopleName.[FirstName]
FROM [dbo].[people] people
INNER JOIN [dbo].[people_NAME] peopleName on peopleName.[Id] = people.[Id]
WHERE EXISTS (SELECT *
FROM [dbo].[people_NAME] peopleName2
WHERE peopleName2.[Id] != people.[id]
AND peopleName2.[FirstName] LIKE '%' + peopleName.[FirstName] + '%')
4 Réponses :
C'est un problème difficile. Je ne pense pas que l'index complet de texte vous aidera, car vous souhaitez comparer deux colonnes.
qui ne laisse pas de bonnes options. Une possibilité est de mettre en œuvre ngams em>. Ce sont des séquences de caractères (disons, 3 d'une rangée) qui proviennent d'une chaîne. De mon prénom, vous auriez: p> alors vous pouvez les utiliser pour une correspondance directe sur une autre colonne. alors em> vous devez faire du travail supplémentaire pour voir si le nom complet d'une colonne correspond à une autre. Mais les ngrams devraient réduire considérablement l'espace de travail. P> En outre, la mise en œuvre de ngams nécessite des travaux. Une méthode utilise un déclencheur qui calcule les ngams pour chaque nom, puis les insère dans une table de ngram. P> Je ne sais pas si tout ce travail vaut l'effort de résoudre votre problème. Mais il est possible d'accélérer la recherche. P> p>
C'est intéressant, mais en effet, ce n'est pas une solution possible pour moi. Merci quand même.
Avez-vous essayé une jointure au lieu d'une requête corrélée? Pré> xxx pré> p>
Merci pour votre réponse. Je l'ai essayé et il est encore plus lent parce qu'il y a beaucoup de matchs.
Vous pouvez le faire,
select * from CTE
Merci pour la réponse, votre solution n'est pas plus rapide que la première.
Jetez un oeil à ma réponse à propos de l'utilisation de Cela pourrait être assez performant si vous utilisez des astuces p> Vous pouvez gagner beaucoup de vitesse si vous jouez avec une classement, essayez ceci: p> comme code> Opérateur Ici SELECT TOP 10 p.[Id], n.[LastName], n.[FirstName]
FROM [dbo].[people] p
INNER JOIN [dbo].[people_NAME] n on n.[Id] = p.[Id]
INNER JOIN [dbo].[people_NAME] n2 on
lower(n2.[FirstName]) collate latin1_general_bin
LIKE
'%' + lower(n1.[FirstName]) + '%' collate latin1_general_bin
GROUP BY n1.[Id], n1.[FirstName]
HAVING COUNT(*)>1
Merci pour votre réponse, je vais vérifier cela. En attendant, je ferme ce post. J'ai beaucoup d'exérétions à faire :).
C'est ce qui se passe lors de l'utilisation de
comme code> avec une carte générique sur le côté gauche ... Vous pouvez essayer de créer un index surgens_name (prénom) code> mais il ne fera probablement pas de différence de performance réelle.Cette requête est identique à celle-ci à celle-ci
Sélectionnez le top 10 distinct [ID], PN. [Nom], Pn. [Prénom] [DGO]. [Personnes] P ROCIER INTERNE [DGO] [NOME ] pn sur pn. [id] = p. [id] code>Joindre intérieur et existe sur la même table?
J'ai besoin d'amener les personnes avec nom inclus dans au moins un nom de personnes. Exemple Si j'ai Bob and Bobby, Bob sera un résultat. J'ai essayé d'ajouter un index mais aucune différence :(!
Index de texte intégral ?
Je n'ai pas essayé de créer un index de texte complet, cela ferait-il une grande différence? Je suis réticent à créer un index car il s'agit d'une chose statistique une chose que je dois faire.
Vous devez enquêter sur la situation, mais c'est le but d'un indice de texte complet ... Trouver des morceaux de texte aléatoires de manière performante.
En réalité, l'ajout de la valeur codée sans code papier n'est pas ce qui l'accélère,
comme "%% quelque chose code> (commence par%) sera lent. La raison pour laquelle votre valeur codée est rapide est que cela trouve 10 matchs au début de l'analyse.C'est une table physique
Quelle version de SQL Server utilisez-vous?
Studio de gestion de Server Microsoft SQL Server 11.0.2100.60