使用INNER JOIN进行LEFT OUTER JOIN

时间:2013-11-22 10:13:23

标签: sql sql-server

我有一张学生表。 还有一张教师表。

一些学生(并非所有学生)将分配一名教师。 这是在第3个表格中控制的,通过studentID和teacherID

将这些学生与他们的老师相匹配

我需要SQL做什么,是LEFT OUTER JOIN到第3个表,然后是INNER JOINED到教师的桌子上(因为不是所有的学生都会出现在第3个表中,但是任何老师出现在第3个表中的将出现在教师表中。

我希望获得所有学生姓名和教师姓名的结果(如果没有,则为空)。

我到目前为止看起来像这样,它基本上是一个完整的INNER JOIN,并没有给我没有指定老师的学生:

SELECT firstname, teacherlastName
FROM tblstudents 

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

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

有人可以给我一个指针吗?我尝试放置括号,但没有看到,以帮助。

谢谢!

5 个答案:

答案 0 :(得分: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非常擅长在需要的子查询中传播谓词,因此我赞成第一种方法来实现可读性和效率。

修改

我没有正确阅读问题,我认为你不想要tblStudentRakazot中的teacherID为NULL的记录。如果这不是问题,那么您可以简单地使用两个LEFT JOINS,而不使用上面的where子句:

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

答案 1 :(得分:1)

您不使用INNER JOIN,而只使用其他LEFT JOIN

将tblStudents视为您的基础。你想得到所有这些,而不是过滤任何东西,只附加可选信息。 使用第一个左连接,您附加第一个信息
学生 - > TeacherAssignment
TeacherAssignment可以为null或不为null。 现在您只附上另一个信息 - 从tblTeachers拉出教师的全名 学生 - > TeacherAssignnent - > TeacherName
用另一个LEFT JOIN执行此操作。在可能的情况下附加信息,即TeacherAssignment不为空的位置。 无论如何,这会忽略TeacherAssignment为null的行。

答案 2 :(得分: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 

答案 3 :(得分: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

如果教师表中的某些数据是唯一的,您始终可以使用外部联接。它将给出与内连接相同的结果。

答案 4 :(得分:0)

您不能像在@GarethD示例中那样使用子查询。

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

但是当更深入地查看此查询的执行计划和使用子查询的查询时,可能是等效的。