2013-11-22 57 views
0

我有一張學生表。 和一張教師表。左外聯接與內聯接

有些學生(不是全部)會分配給他們的老師。 這是控制在3臺,配套的學生與老師,通過studentID和teacherID

我需要的SQL做的,就是LEFT OUTER JOIN到3臺,然後將其INNER JOINED到教師的表(因爲不是所有的學生都會出現在第三張表格中,但是出現在第三張表格中的任何一位老師都會出現在教師表格中)。

我希望得到所有學生姓名和教師姓名的結果,他們在哪裏被分配(如果沒有,則爲空)。

什麼我到目前爲止是這樣的,它基本上工作作爲一個完整的INNER JOIN,並且不給我沒有老師誰的學生分配:

SELECT firstname, teacherlastName 
FROM tblstudents 

left outer join [tblStudentRakazot] 
ON tblstudents.studentid = [tblStudentRakazot].studentID 

INNER JOIN tblteachers 
ON [tblStudentRakazot].teacherid = tblteachers.teacherID 

有人可以請給我一個指針這裏?我嘗試了放置括號,但沒有看到,幫助。

謝謝!

回答

1

您不使用INNER JOIN但只有另一個LEFT JOIN

認爲tblStudents是您的基礎。你想得到他們所有的人,不過濾任何東西,只附加可選信息。 隨着第一次左參加,您附加第一個信息
學生 - >教師評議
TeacherAssignment可以爲null或非空。 現在您只附加其他信息 - 教師的全名從tblTeachers中提取。
學生 - > TeacherAssignnent - >教師姓名
用另一個LEFT JOIN來做到這一點。在可能的情況下,即附加信息,即TeacherAssignment不爲null。 無論如何,這忽略了TeacherAssignment爲空的行。

+0

+1爲患者解釋! – kneidels

1

你可以將你的INNER JOIN一個子查詢

SELECT firstname, teacherlastName 
FROM tblstudents 
     LEFT OUTER JOIN 
     ( SELECT [tblStudentRakazot].studentID, tblTeachers.teacherlastName 
      FROM [tblStudentRakazot] 
        INNER JOIN tblteachers 
         ON [tblStudentRakazot].teacherid = tblteachers.teacherID 
     ) teachers 
      ON tblstudents.studentid = teachers.studentID 

另一種選擇是使用更復雜的where子句。

SELECT firstname, teacherlastName 
FROM tblstudents 
     LEFT JOIN [tblStudentRakazot] 
      ON tblstudents.studentid = [tblStudentRakazot].studentID 
     LEFT JOIN tblteachers 
      ON [tblStudentRakazot].teacherid = tblteachers.teacherID 
WHERE [tblStudentRakazot] IS NULL 
OR  tblteachers.teacherID IS NOT NULL 

但是,SQL Server是在propogating謂詞在哪裏,它需要的子查詢的還不錯,所以我贊成兩個​​readabilty和效率的第一種方法。

編輯

我沒有正確讀取的問題,我還以爲你不想記錄,其中在tblStudentRakazot的teacherID爲NULL。如果這不是一個問題,那麼你可以簡單地使用兩個左連接,而無需如上述的where子句:

SELECT firstname, teacherlastName 
FROM tblstudents 
     LEFT JOIN [tblStudentRakazot] 
      ON tblstudents.studentid = [tblStudentRakazot].studentID 
     LEFT JOIN tblteachers 
      ON [tblStudentRakazot].teacherid = tblteachers.teacherID 
+0

我開始懷疑我是否誤解了某些東西:他只是想讓學生和指定的教師或爲老師填空。在你的第二個查詢中根本不需要任何WHERE部分... – KekuSemau

+1

@KekuSemau我沒有正確地閱讀這個問題,我以爲OP不希望記錄tblStudentRakazot中的teacherID爲NULL的記錄,這就是爲什麼我認爲where子句是必需的,你是對的,這不是必需的。 – GarethD

0
SELECT b.student_firstname, teacherlastName 
FROM thirdtable a 
left join studenttbl b on a.studentid = b.studentid 
left join teachertbl b on a.teacherid = b.teacherid 

如果您確定教師表中的數據是唯一的,您可以隨時使用外連接。它會得到與內連接相同的結果。

0

您可能不會像@GarethD示例中那樣使用子查詢。

SELECT firstname, teacherlastName 
FROM tblstudents 
LEFT OUTER JOIN [tblStudentRakazot] 
    INNER JOIN tblteachers 
     ON [tblStudentRakazot].teacherid = tblteachers.teacherID 
    ON tblstudents.studentid = [tblStudentRakazot].studentID 

但是,當更深入地查看此查詢的執行計劃和子查詢查詢可能是等效的。

1
SELECT firstname, teacherlastName 
FROM tblstudents 
left outer join 
(select * from 
[tblStudentRakazot] A INNER JOIN tblteachers B 
ON A.teacherid = B.teacherID)AS C 
ON tblstudents.studentid = C.studentID 
+0

感謝你,你的回答非常有幫助,因爲它使我能夠在內部的'SELECT'上使用'WHERE'子句 – kneidels