SQL Inner-join avec 3 tables?

330

J'essaye de joindre 3 tables dans une vue; voici la situation:

J'ai un tableau qui contient des informations sur les étudiants qui postulent pour vivre sur ce campus universitaire. J'ai un autre tableau qui répertorie les préférences de la salle (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 a un nom de salle correspondant dans une troisième table (n'a pas conçu cette base de données ...).

À peu près, j'ai INNER JOINsur la table avec leurs préférences et leurs informations, le résultat est quelque chose comme ...

 John Doe | 923423 | Incoming Student | 005

005serait le HallID. Alors maintenant, je veux faire correspondre cela HallIDà une troisième table, où cette table contient un HallIDet HallName.

Donc, à peu près, je veux que mon résultat soit comme ...

 John Doe | 923423 | Incoming Student | Foley Hall <---(INSTEAD OF 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
Bob Sanders
la source

Réponses:

503

Vous pouvez faire ce qui suit (je suppose que 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 façon. Vous venez de vous joindre à votre table Hall plusieurs fois pour chaque ID de pièce préférée:

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
Taryn
la source
1
Cela fonctionne avec une seule préférence, mais comment voudrais-je le modifier pour le faire fonctionner avec 3 préférences? (une colonne pour chaque préférence)
Bob Sanders
1
@BobSanders vient de mettre à jour ma réponse, alors si vous ne voulez pas que le numéro HallPref supprime simplement ces colonnes
Taryn
46
SELECT column_Name1,column_name2,......
  From tbl_name1,tbl_name2,tbl_name3
  where tbl_name1.column_name = tbl_name2.column_name 
  and tbl_name2.column_name = tbl_name3.column_name
Lomorng
la source
27
Cette réponse manque d'explications raisonnables pour montrer au PO comment atteindre les objectifs initiaux.
gaige
41

Si vous avez 3 tables avec le même IDà joindre, je pense que ce serait comme ça:

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 tableaux.

aquatorrent
la source
6
SELECT table1.col,table2.col,table3.col 
FROM table1 
INNER JOIN 
(table2 INNER JOIN table3 
ON table3.id=table2.id) 
ON table1.id(f-key)=table2.id
AND //add any additional filters HERE
Khurram Basharat
la source
3

Vous avez juste besoin d'une deuxième jointure interne qui relie le fichier ID Numberque vous avez maintenant au ID Numbertroisième tableau. Ensuite, remplacez le ID Numberpar le Hall Nameet voilá :)

un F.
la source
2
SELECT * 
FROM 
    PersonAddress a, 
    Person b,
    PersonAdmin c
WHERE a.addressid LIKE '97%' 
    AND b.lastname LIKE 'test%'
    AND b.genderid IS NOT NULL
    AND a.partyid = c.partyid 
    AND b.partyid = c.partyid;
ashu
la source
2

Il y a eu beaucoup de réponses mais la leçon générale semble être que vous pouvez utiliser plusieurs JOINS dans une clause where; aussi techonthenet.com (mon patron me l'a recommandé, c'est comme ça que je l'ai trouvé) a de bons tutoriels SQL si vous avez une autre question et que vous voulez juste essayer de la comprendre.

SELECT table1.column1
FROM table1
WHERE table1 > 0 (or whatever you want to specify)
INNER JOIN table1 
ON table1.column1 = table2.column1
Nathan
la source
1

Ceci est une requête correcte pour la table join 3 avec le même identifiant **

select a.empname,a.empsalary,b.workstatus,b.bonus,c.dateofbirth from employee a, Report b,birth c where a.empid=b.empid and a.empid=c.empid and b.empid='103';

première table de l'employé. rapport deuxième tableau. naissance troisième table

Sri Siva
la source
1
SELECT 
A.P_NAME AS [INDIVIDUAL NAME],B.F_DETAIL AS [INDIVIDUAL FEATURE],C.PL_PLACE AS [INDIVIDUAL LOCATION]
FROM 
[dbo].[PEOPLE] A
INNER JOIN 
[dbo].[FEATURE] B ON A.P_FEATURE = B.F_ID
INNER JOIN 
[dbo].[PEOPLE_LOCATION] C ON A.P_LOCATION = C.PL_ID
p.ajay
la source
1

Cette requête fonctionnera pour vous

Select b.id as 'id', u.id as 'freelancer_id', u.name as 
'free_lancer_name', p.user_id as 'project_owner', b.price as 
'bid_price', b.number_of_days as 'days' from User u, Project p, Bid b 
where b.user_id = u.id and b.project_id = p.id
Murtaza Manasawala
la source
1
select products.product_id, product_name, price, created_at, image_name, categories.category_id, category_name,brands.brand_id, brand_name 
FROM products INNER JOIN categories USING (category_id) INNER JOIN brands USING(brand_id)
Eahiya
la source
-5
select empid,empname,managename,[Management ],cityname  
from employees inner join Managment  
on employees.manageid = Managment.ManageId     
inner join CITY on employees.Cityid=CITY.CityId


id name  managename  managment  cityname
----------------------------------------
1  islam   hamza       it        cairo
Islam Hamza
la source