web-dev-qa-db-fra.com

Opérateur "Like" dans la jointure interne dans SQL

En utilisant Sequel Pro, j'ai ces deux tableaux:

Table1

Name         Year    x      y
John Smith   2010    10     12
Adam Jones   2010    8      13
John Smith   2011    7      15
Adam Jones   2011    9      14
etc.

et

Table2

Name                    Year  z    
Smith John Smith John   2010  27
Jones Adam Jones Adam   2010  25
Smith John Smith John   2011  29
Jones Adam Jones Adam   2011  21
etc.

Fondamentalement, les noms du tableau 2 sont les mêmes uniquement avec le nom et le prénom commutés, puis répétés une fois. Ainsi, les noms dans Table1 se trouvent dans les noms de Table2 ("John Smith" se trouve dans "Smith John Smith John"). Je veux effectuer une jointure interne et connecter la valeur z de Table2 aux autres valeurs de Table1 et obtenir quelque chose comme ceci:

Name       x     y     z
John Smith 10    12    27
Adam Jones 8     13    25

Pour ce faire, j'ai exécuté cette requête:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%Table2.Name%" and Table1.Year=Table2.Year

Mais je l'ai obtenu comme sortie:

Name  Year  x  y  z

Et c'est tout. J'ai eu les titres, mais pas de lignes. Je ne sais pas ce que je fais mal ... Je soupçonne que cela a probablement à voir avec la façon dont j'utilise l'opérateur similaire, mais je ne sais pas. Toute aide serait très appréciée.

12
japem

Mis à part un modèle de données étrange, vous avez inversé les tables dans la partie LIKE (table1.name devrait faire partie de table2.name, et non l'inverse), et vous devez ajouter les pourcentages à la valeur , pas le nom du champ, qui signifie ne pas citer le nom;

SELECT table1.*, table2.z
FROM table1
INNER JOIN table2
  ON table2.name LIKE CONCAT('%', table1.name, '%') 
 AND table1.year = table2.year

n SQLfiddle pour tester avec .

31
Joachim Isaksson

Votre requête est incorrecte, vous dites que le contenu de la colonne doit être comme abcdTable2.Nameefgh. Ce serait correct:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%" + Table2.Name+ "%" and Table1.Year=Table2.Year

Cette requête sera assez lente pour une table plus grande, mais je crains que si vous vous joignez à un nom uniquement, la table ne peut pas vraiment être plus grande car vous aurez bientôt des doublons.

5
Tomas Pastircak

essaye ça:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like Concat('%',Table2.Name,'%') and Table1.Year=Table2.Year

dans votre requête, il recherchera une chaîne contenant Table2.Name (c'est comme constant)

comme suggestion de joindre des noms est très très mauvais, et si vous avez 2 personnes avec le même nom ??! Vous devez donc disposer d'une clé primaire et étrangère pour cela.

3
Reza