SQL Inner-Join mit 3 Tabellen?

330

Ich versuche, 3 Tabellen in einer Ansicht zu verknüpfen. Hier ist die Situation:

Ich habe eine Tabelle mit Informationen von Studenten, die sich bewerben, um auf diesem College-Campus zu leben. Ich habe eine andere Tabelle, in der die Halleneinstellungen (3 davon) für jeden Schüler aufgeführt sind. Jede dieser Einstellungen ist jedoch lediglich eine ID-Nummer, und die ID-Nummer hat einen entsprechenden Hallennamen in einer dritten Tabelle (diese Datenbank wurde nicht entworfen ...).

Ziemlich genau, ich habe INNER JOINmit ihren Vorlieben und ihren Informationen auf dem Tisch, das Ergebnis ist so etwas wie ...

 John Doe | 923423 | Incoming Student | 005

Wo 005wäre das HallID? Jetzt möchte ich das HallIDeiner dritten Tabelle zuordnen, in der diese Tabelle ein HallIDund enthält HallName.

Ich möchte, dass mein Ergebnis so aussieht wie ...

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

Folgendes habe ich derzeit:

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
quelle

Antworten:

503

Sie können Folgendes tun (ich habe auf Tabellenfeldern usw. geraten)

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

Aufgrund Ihrer Anfrage nach mehreren Hallen können Sie dies auf diese Weise tun. Sie setzen sich einfach mehrmals für jede Raumpräferenz-ID an Ihren Hallentisch:

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
quelle
1
Dies funktioniert mit nur einer Einstellung, aber wie möchte ich diese bearbeiten, damit sie mit drei Einstellungen funktioniert? (eine Spalte für jede Präferenz)
Bob Sanders
1
@ BobSanders hat gerade meine Antwort aktualisiert. Wenn Sie die HallPref-Nummer nicht möchten, löschen Sie einfach diese Spalten
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
quelle
27
Dieser Antwort fehlt eine vernünftige Erklärung, um dem OP zu zeigen, wie die ursprünglichen Ziele erreicht werden können.
Gaige
41

Wenn Sie 3 Tabellen mit derselben IDzu verbinden haben, würde es meiner Meinung nach so aussehen:

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

Ersetzen *Sie einfach durch das, was Sie aus den Tabellen erhalten möchten.

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

Sie brauchen nur einen zweiten inneren Join, der den ID Number, den Sie jetzt haben, mit dem ID Numberder dritten Tabelle verknüpft . Danach ersetzen Sie die ID Numberdurch die Hall Nameund voilá :)

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

Es gab viele Antworten, aber die allgemeine Lektion scheint zu sein, dass Sie mehrere JOINS in einer where-Klausel verwenden können. Auch techonthenet.com (mein Chef hat es mir empfohlen, so habe ich es gefunden) bietet gute SQL-Tutorials, wenn Sie jemals eine andere Frage haben und nur versuchen möchten, es herauszufinden.

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

Dies ist die richtige Abfrage für Join 3-Tabelle mit derselben 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';

Mitarbeiter erste Tabelle. zweite Tabelle melden. Geburt dritte Tabelle

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

Diese Abfrage funktioniert für Sie

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