SQL Inner-join com 3 tabelas?

330

Estou tentando juntar 3 tabelas em uma exibição; aqui está a situação:

Eu tenho uma tabela que contém informações de alunos que estão se candidatando para morar neste campus universitário. Eu tenho outra tabela que lista as Preferências do Hall (3 delas) para cada aluno. Mas cada uma dessas preferências é apenas um número de identificação e o número de identificação possui um nome de salão correspondente em uma terceira tabela (não projetou esse banco de dados ...).

Praticamente, eu tenho INNER JOINna mesa as preferências e informações deles, o resultado é algo como ...

 John Doe | 923423 | Incoming Student | 005

Onde 005estaria o HallID. Então agora eu quero combinar isso HallIDcom uma terceira tabela, onde esta tabela contém um HallIDe HallName.

Então, basicamente, eu quero que meu resultado seja como ...

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

Aqui está o que eu tenho atualmente:

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
fonte

Respostas:

503

Você pode fazer o seguinte (adivinhei nos campos da tabela, 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

Com base no seu pedido de vários salões, você poderia fazê-lo dessa maneira. Você acabou de entrar na sua mesa do Hall várias vezes para cada ID de pref da sala:

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
fonte
1
Isso funciona com apenas uma preferência, mas como eu gostaria de editar isso para fazer funcionar com três preferências? (uma coluna por cada preferência)
Bob Sanders
1
@BobSanders acaba de atualizar a minha resposta, então, se você não quer que o número HallPref apenas uma gota essas colunas
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
fonte
27
Essa resposta carece de explicação razoável para mostrar ao OP como atingir as metas originais.
gaige
41

Se você tem 3 tabelas com as mesmas IDpara serem unidas, acho que seria assim:

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

Apenas substitua *pelo que você deseja obter das tabelas.

aquatorrent
fonte
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
fonte
3

Você só precisa de uma segunda junção interna que vincule a ID Numberque você tem agora à ID Numberterceira tabela. Depois, substitua ID Numberpor by Hall Namee voilá :)

aF.
fonte
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
fonte
2

Houve muitas respostas, mas a lição geral parece ser que você pode usar várias JOINS em uma cláusula where; Também o techonthenet.com (meu chefe me recomendou, foi assim que eu o encontrei) tem bons tutoriais de SQL, se você tiver outra pergunta e quiser apenas tentar descobrir.

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

Esta é a consulta correta para a junção da tabela 3 com o mesmo 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';

primeira mesa do empregado. relatar segunda tabela. terceira mesa de nascimento

Sri Siva
fonte
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
fonte
1

Esta consulta funcionará para você

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
fonte
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
fonte
-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
fonte