SQL Inner-join con 3 tabelle?


330

Sto cercando di unire 3 tavoli in una vista; ecco la situazione:

Ho una tabella che contiene informazioni sugli studenti che si stanno candidando per vivere in questo campus universitario. Ho un'altra tabella che elenca le preferenze di sala (3 di esse) per ogni studente. Ma ognuna di queste preferenze è semplicemente un numero ID e il numero ID ha un corrispondente nome sala in una terza tabella (non ha progettato questo database ...).

Praticamente, ho INNER JOINsul tavolo le loro preferenze e le loro informazioni, il risultato è qualcosa come ...

 John Doe | 923423 | Incoming Student | 005

Dove 005sarebbe il HallID. Quindi ora voglio abbinarlo HallIDa una terza tabella, dove questa tabella contiene un HallIDe HallName.

Praticamente, voglio che il mio risultato sia come ...

 John Doe | 923423 | Incoming Student | Foley Hall <---(INSTEAD OF 005)

Ecco quello che ho attualmente:

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

Risposte:


503

Puoi fare quanto segue (ho indovinato sui campi della tabella, ecc.)

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

Sulla base della tua richiesta per più sale, puoi farlo in questo modo. Ti basta unirti al tavolo della Hall più volte per ogni pref id di una stanza:

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
Funziona con una sola preferenza, ma come vorrei modificarlo per farlo funzionare con 3 preferenze? (una colonna per ogni preferenza)
Bob Sanders,

1
@BobSanders ha appena aggiornato la mia risposta, quindi se non vuoi che il numero HallPref lasci cadere quelle colonne
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

27
Questa risposta non ha una spiegazione ragionevole per mostrare all'OP come raggiungere gli obiettivi originali.
gaige

41

Se hai 3 tavoli con lo stesso IDda unire, penso che sarebbe così:

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

Sostituisci semplicemente *con quello che vuoi ottenere dai tavoli.


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

3

Hai solo bisogno di un secondo join interno che colleghi quello ID Numberche hai ora al ID Numberterzo della tabella. Successivamente, sostituisci ID Numbercon il Hall Namee voilá :)


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;

2

Ci sono state molte risposte ma la lezione generale sembra essere che puoi usare più JOIN in una clausola where; anche techonthenet.com (il mio capo me lo ha consigliato, è così che l'ho trovato) ha buoni tutorial SQL se hai mai un'altra domanda e vuoi solo provare a capirlo.

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

1

Questa è la query corretta per la tabella join 3 con lo stesso ID **

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';

primo tavolo dei dipendenti. riporta la seconda tabella. terzo tavolo di nascita


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

1

Questa query funzionerà per te

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

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)

-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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.