我有一张学生桌子。还有一张老师的桌子。
有些学生(不是所有的)都会派一位老师给他们。这被控制在第三张表中,通过studentID和teacherID将这些学生和他们的老师进行匹配。
我需要SQL做的是将LEFT OUTER JOIN放到第3表上,然后将INNER JOINED放到教师的表上(因为不是所有的学生都会出现在第3表中,但是出现在第3表中的任何教师都会出现在教师表中)。
我希望得到所有学生的名字和老师的名字的结果,在那里他们被分配(如果不是空的话)。
到目前为止,我所拥有的是这样的,它基本上是一个完整的内在连接,并且没有给我那些没有老师的学生:
SELECT firstname, teacherlastName
FROM tblstudents
left outer join [tblStudentRakazot]
ON tblstudents.studentid = [tblStudentRakazot].studentID
INNER JOIN tblteachers
ON [tblStudentRakazot].teacherid = tblteachers.teacherID有人能在这里给我一个指针吗?我试着放括号,但没看到,想帮忙。
谢谢!
发布于 2013-11-22 10:28:28
您不使用INNER JOIN,而只使用另一个LEFT JOIN。
将tblStudents作为您的基础。你想得到所有的信息,而不是过滤掉任何东西,只附加可选的信息。使用第一个左联接,您可以附加第一个信息。
学生-> TeacherAssignment
TeacherAssignment可以是空的,也可以是非空的。现在你只需要附上另一个信息--老师的全名从tblTeachers上删除。
学生-> TeacherAssignnent -> TeacherName
使用另一个LEFT JOIN执行此操作。它在可能的情况下附加信息,即TeacherAssignment不为空的位置。这将忽略TeacherAssignment为null的行。
发布于 2013-11-22 10:19:21
您可以将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非常擅长将谓词从需要的子查询中传递出来,因此我倾向于采用第一种方法,以提高可读性和效率。
编辑
我没有正确地阅读这个问题,我以为您不想要teacherID中的tblStudentRakazot为NULL的记录。如果这不是问题,那么您可以简单地使用两个左联接,而不需要上面的where子句:
SELECT firstname, teacherlastName
FROM tblstudents
LEFT JOIN [tblStudentRakazot]
ON tblstudents.studentid = [tblStudentRakazot].studentID
LEFT JOIN tblteachers
ON [tblStudentRakazot].teacherid = tblteachers.teacherID发布于 2013-11-22 10:38:12
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 https://stackoverflow.com/questions/20142266
复制相似问题