381 votes

Requête SQL Inner-join avec 3 tables?

Je tente de joindre 3 tables dans une vue; voici la situation:

J'ai une table qui contient des informations sur les étudiants qui postulent pour vivre sur ce campus universitaire. J'ai une autre table qui répertorie les préférences de résidence (3 d'entre elles) pour chaque étudiant. Mais chacune de ces préférences n'est qu'un numéro d'identification, et le numéro d'identification correspond à un nom de résidence dans une troisième table (je n'ai pas conçu cette base de données...).

En gros, j'ai fait un INNER JOIN sur la table avec leurs préférences et leurs informations, le résultat est quelque chose comme...

 John Doe | 923423 | Étudiant entrant | 005

005 serait l'ID de la résidence. Maintenant, je veux faire correspondre cet ID de résidence à une troisième table, où cette table contient un ID de résidence et un nom de résidence.

En gros, je veux que mon résultat soit comme...

 John Doe | 923423 | Étudiant entrant | Résidence Foley <---(AU LIEU DE 005)

Voici ce que j'ai actuellement:

SELECT
  s.StudentID, s.FName, 
  s.LName, s.Gender, s.BirthDate, s.Email, 
  r.HallPref1, r.HallPref2, r.HallPref3
FROM
  dbo.StudentSignUp AS s 
  INNER JOIN RoomSignUp.dbo.Incoming_Applications_Current AS r 
    ON s.StudentID = r.StudentID 
  INNER JOIN HallData.dbo.Halls AS h 
    ON r.HallPref1 = h.HallID

558voto

bluefeet Points 105508

Vous pouvez faire ce qui suit (j'ai supposé sur les champs de table, etc.)

SELECT s.studentname
    , s.studentid
    , s.studentdesc
    , h.hallname
FROM students s
INNER JOIN hallprefs hp
    on s.studentid = hp.studentid
INNER JOIN halls h
    on hp.hallid = h.hallid

En fonction de votre demande pour plusieurs salles, vous pouvez le faire de cette manière. Il suffit de rejoindre votre table Hall plusieurs fois pour chaque identifiant de préférence de salle:

SELECT     s.StudentID
    , s.FName
    , s.LName
    , s.Gender
    , s.BirthDate
    , s.Email
    , r.HallPref1
    , h1.hallName as Pref1HallName
    , r.HallPref2 
    , h2.hallName as Pref2HallName
    , r.HallPref3
    , h3.hallName as Pref3HallName
FROM  dbo.StudentSignUp AS s 
INNER JOIN RoomSignUp.dbo.Incoming_Applications_Current AS r 
    ON s.StudentID = r.StudentID 
INNER JOIN HallData.dbo.Halls AS h1 
    ON r.HallPref1 = h1.HallID
INNER JOIN HallData.dbo.Halls AS h2
    ON r.HallPref2 = h2.HallID
INNER JOIN HallData.dbo.Halls AS h3
    ON r.HallPref3 = h3.HallID

1 votes

Cela fonctionne avec une seule préférence, mais comment puis-je modifier ceci pour que cela fonctionne avec 3 préférences ? (une colonne pour chaque préférence)

1 votes

@BobSanders vient de mettre à jour ma réponse, donc si vous ne souhaitez pas le numéro HallPref, il suffit de supprimer ces colonnes

60voto

aquatorrent Points 82

Si vous avez 3 tables avec le même ID à joindre, je pense que cela ressemblerait à ceci :

SELECT * FROM table1 a
JOIN table2 b ON a.ID = b.ID
JOIN table3 c ON a.ID = c.ID

Remplacez simplement * par ce que vous voulez obtenir des tables.

48voto

Lomorng Points 69
SÉLECTIONNER nom_de_colonne1, nom_de_colonne2,......
  De nom_tbl1, nom_tbl2, nom_tbl3
  où nom_tbl1.nom_colonne = nom_tbl2.nom_colonne 
  et nom_tbl2.nom_colonne = nom_tbl3.nom_colonne

36 votes

Cette réponse manque d'explication raisonnable pour montrer à l'OP comment atteindre les objectifs initiaux.

7voto

SELECT table1.col,table2.col,table3.col 
FROM table1 
INNER JOIN 
(table2 INNER JOIN table3 
ON table3.id=table2.id) 
ON table1.id(f-clé)=table2.id
AND //ajouter d'autres filtres ICI

3voto

aF. Points 15815

Il vous suffit simplement d'ajouter une deuxième jointure interne qui relie le Numéro d'ID que vous avez maintenant avec le Numéro d'ID de la troisième table. Ensuite, remplacez le Numéro d'ID par le Nom du Hall et voilà :)

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