C'est un peu compliqué, mais j'ai 2 tables. Disons que la structure est quelque chose comme ceci:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
Les tables peuvent être jointes en fonction de Table1.PhoneNumber1 -> Table2.PhoneNumber ou Table1.PhoneNumber2 -> Table2.PhoneNumber.
Maintenant, je souhaite obtenir un jeu de résultats contenant PhoneNumber1, SomeOtherField qui correspond à PhoneNumber1, PhoneNumber2 et SomeOtherField qui correspond à PhoneNumber2.
J'ai pensé à 2 façons de le faire - soit en se joignant à la table deux fois, soit en se joignant une fois avec un OU dans la clause ON.
Méthode 1 :
SELECT t1.PhoneNumber1, t1.PhoneNumber2,
t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
ON t3.PhoneNumber = t1.PhoneNumber2
Cela semble fonctionner.
Méthode 2 :
Pour avoir une requête qui ressemble un peu à ceci -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
Je n'ai pas encore réussi à faire fonctionner cela et je ne sais pas s'il existe un moyen de le faire.
Quelle est la meilleure façon d'y parvenir? Aucun des deux moyens ne semble simple ou intuitif ... Y a-t-il un moyen plus simple de le faire? Comment cette exigence est-elle généralement mise en œuvre?
Le premier est bon à moins que Phone1 ou (plus probablement) phone2 ne soit nul. Dans ce cas, vous souhaitez utiliser une jointure gauche au lieu d'une jointure interne.
C'est généralement un mauvais signe lorsque vous avez une table avec deux champs de numéro de téléphone. Habituellement, cela signifie que la conception de votre base de données est défectueuse.
la source
Vous pouvez utiliser
UNION
pour combiner deux jointures:la source
Mon problème était d' afficher l'enregistrement même s'il n'y a pas ou un seul numéro de téléphone (carnet d'adresses complet). Par conséquent, j'ai utilisé une jointure à gauche qui prend tous les enregistrements de la gauche, même si aucune correspondance n'existe à droite. Pour moi, cela fonctionne dans Microsoft Access SQL (ils nécessitent la parenthèse!)
la source
La première méthode est la bonne approche et fera ce dont vous avez besoin. Cependant, avec les jointures internes, vous ne sélectionnerez des lignes que
Table1
si les deux numéros de téléphone existent dansTable2
. Vous souhaiterez peut-être faire uneLEFT JOIN
pour que toutes les lignes deTable1
soient sélectionnées. Si les numéros de téléphone ne correspondent pas, leSomeOtherField
s serait nul. Si vous voulez vous assurer d'avoir au moins un numéro de téléphone correspondant, vous pouvez le faireWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL
La deuxième méthode pourrait avoir un problème: que se passe-t-il si
Table2
a les deuxPhoneNumber1
etPhoneNumber2
? Quelle ligne sera sélectionnée? Selon vos données, clés étrangères, etc., cela peut ou non être un problème.la source