3 votes

SQL Joindre Query multiple One-to-many? or many-to-many?

Je suis en train de faire un test de traduction.

J'ai deux tables, une table 'client(s)' et une table 'noms' individuelle. Le principe est qu'un client peut avoir un ou deux (maximum) noms. Je les ai structurés de cette manière afin que chaque 'nom' puisse avoir un titre différent. Les tables sont :

clients
+------------+-------------+------------+
| clientID   | nameID1     | nameID2    |
+------------+-------------+------------+
|          1 | 1           | 2          |
|          2 | 3           |            |
|          3 | 4           |            |
+------------+-------------+------------+

names 
+------------+-------------+------------+------------+
| nameID     | surname     | initials   | titleID    |
+------------+-------------+------------+------------+
|          1 | Banks       | P          | 1          |
|          2 | Smith       | W          | 2          |
|          3 | Wilson      | BT         | 2          |
|          4 | Jefferson   | JP         | 3          |
+------------+-------------+------------+------------+

Où titleID est récupéré de...

titles 
    +------------+-------------+
    | titleID    | titleName   |
    +------------+-------------+
    |          1 | Mr          |
    |          2 | Mme         |
    |          3 | Mlle        |
    +------------+-------------+

Donc par exemple, clientID = 1 est M. P Banks '&' Mme W Smith

Le problème est que je ne suis pas familier avec les requêtes pour obtenir cette réponse ci-dessus.

Je ne peux pas essayer :

SÉLECTIONNER
clientID, noms.nom, noms.initiales, titreNom
DE clients, noms, titres
OÙ titleID = titleID AND
NameID1 = nameID AND
NameID2 = nameID

Comment joindre correctement les tables dans une requête pour trouver, par exemple, clientID 1 = M. P Banks '&' Mme W Smith

3voto

StuartLC Points 35534

Vous devez joindre la table des noms (et titres) deux fois, une fois pour nameID1 et une fois pour nameID2. J'ai supposé que le client doit avoir au moins un nom, donc nameID1 est INNER JOIN, et comme nameID2 est facultatif (nullable), c'est un LEFT OUTER JOIN.

SELECT c.clientID, n1.surname, n1.initials, t1.titleName, n2.surname, n2.initials, t2.titleName
FROM clients c
INNER JOIN names n1 ON nameID1 = n1.nameID
INNER JOIN titles t1 ON n1.titleID = t1.titleID
LEFT OUTER JOIN names n2 ON nameID2 = n2.nameID
INNER JOIN titles t2 ON n2.titleID = t2.titleID

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X