SQL Inner-join con 3 tablas?

330

Estoy tratando de unir 3 tablas en una vista; Aquí está la situación:

Tengo una tabla que contiene información de los estudiantes que solicitan vivir en este campus universitario. Tengo otra tabla que enumera las Preferencias del Salón (3 de ellas) para cada Estudiante. Pero cada una de estas preferencias es simplemente un número de identificación, y el número de identificación tiene un nombre de sala correspondiente en una tercera tabla (no diseñó esta base de datos ...).

Más o menos, tengo INNER JOINsobre la mesa sus preferencias y su información, el resultado es algo así como ...

 John Doe | 923423 | Incoming Student | 005

Donde 005sería el HallID. Así que ahora quiero hacer coincidir eso HallIDcon una tercera tabla, donde esta tabla contiene un HallIDy HallName.

Así que más o menos, quiero que mi resultado sea como ...

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

Esto es lo que tengo actualmente:

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
fuente

Respuestas:

503

Puede hacer lo siguiente (supuse en los campos de la tabla, 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

Según su solicitud de múltiples salas, puede hacerlo de esta manera. Simplemente te unes en tu mesa Hall varias veces para cada id de 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
fuente
1
Esto funciona con una sola preferencia, pero ¿cómo me gustaría editar esto para que funcione con 3 preferencias? (una columna para cada preferencia)
Bob Sanders
1
@BobSanders acaba de actualizar mi respuesta, entonces si no quieres el número de HallPref simplemente suelta esas columnas
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
fuente
27
Esta respuesta carece de una explicación razonable para mostrar al OP cómo lograr los objetivos originales.
gaige
41

Si tiene 3 tablas con las mismas IDpara unir, creo que sería así:

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

Simplemente reemplace *con lo que desea obtener de las tablas.

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

Solo necesita una segunda unión interna que vincule la ID Numberque tiene ahora con la ID Numberde la tercera tabla. Luego, reemplace el ID Numberpor el Hall Namey voilá :)

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

Ha habido muchas respuestas, pero la lección general parece ser que puede usar varias UNIONES en una cláusula where; también techonthenet.com (mi jefe me lo recomendó, así es como lo encontré) tiene buenos tutoriales de SQL si alguna vez tienes otra pregunta y solo quieres intentar resolverla.

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

Esta es la consulta correcta para unirse a la tabla 3 con la misma identificación **

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

Empleado primera mesa. informar segunda mesa. tercera mesa de nacimiento

Sri Siva
fuente
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.ayay
fuente
1

Esta consulta te servirá

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