SQL Inner-join με 3 πίνακες;

Προσπαθώ να ενώσω 3 πίνακες σε μια προβολή:

Έχω έναν πίνακα που περιέχει πληροφορίες για τους φοιτητές που κάνουν αίτηση για να ζήσουν σε αυτό το πανεπιστήμιο. Έχω έναν άλλο πίνακα που παραθέτει τις προτιμήσεις αίθουσας (3 από αυτές) για κάθε φοιτητή. Αλλά κάθε μία από αυτές τις προτιμήσεις είναι απλώς ένας αριθμός ταυτότητας, και ο αριθμός ταυτότητας έχει ένα αντίστοιχο όνομα αίθουσας σε έναν τρίτο πίνακα (δεν σχεδίασα αυτή τη βάση δεδομένων...).

Λίγο πολύ, έχω INNER JOIN στον πίνακα με τις προτιμήσεις τους, και τα στοιχεία τους, το αποτέλεσμα είναι κάτι σαν...

 John Doe | 923423 | Incoming Student | 005

Όπου "005" θα είναι το "HallID". Τώρα λοιπόν θέλω να ταιριάξω αυτό το HallID με έναν τρίτο πίνακα, όπου αυτός ο πίνακας περιέχει ένα HallID και ένα HallName.

Οπότε λίγο πολύ, θέλω το αποτέλεσμά μου να είναι σαν...

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

Εδώ είναι αυτό που έχω αυτή τη στιγμή:

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
Λύση

Μπορείτε να κάνετε τα εξής (υποθέτω για τα πεδία των πινάκων, κ.λπ.)

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

Με βάση το αίτημά σας για πολλαπλές αίθουσες θα μπορούσατε να το κάνετε με αυτόν τον τρόπο. Απλά κάνετε join στον πίνακα Hall πολλαπλές φορές για κάθε id προτίμησης δωματίου:

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
Σχόλια (4)

Αν έχετε 3 πίνακες με το ίδιο "ID" που πρέπει να ενωθούν, νομίζω ότι θα είναι κάπως έτσι:

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

Απλά αντικαταστήστε το * με αυτό που θέλετε να πάρετε από τους πίνακες.

Σχόλια (0)

Χρειάζεστε απλώς μια δεύτερη εσωτερική σύνδεση που συνδέει τον "αριθμό ταυτότητας" που έχετε τώρα με τον "αριθμό ταυτότητας" του τρίτου πίνακα. Στη συνέχεια, αντικαταστήστε τον ID Number με το Hall Name και voilá :)

Σχόλια (0)