我有一张学生表。 还有一张教师表。
一些学生(并非所有学生)将分配一名教师。 这是在第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
有人可以给我一个指针吗?我尝试放置括号,但没有看到,以帮助。
谢谢!
答案 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
但是当更深入地查看此查询的执行计划和使用子查询的查询时,可能是等效的。