首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左外连接与内连接

左外连接与内连接
EN

Stack Overflow用户
提问于 2013-11-22 10:13:22
回答 5查看 461关注 0票数 0

我有一张学生桌子。还有一张老师的桌子。

有些学生(不是所有的)都会派一位老师给他们。这被控制在第三张表中,通过studentID和teacherID将这些学生和他们的老师进行匹配。

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

我希望得到所有学生的名字和老师的名字的结果,在那里他们被分配(如果不是空的话)。

到目前为止,我所拥有的是这样的,它基本上是一个完整的内在连接,并且没有给我那些没有老师的学生:

代码语言:javascript
复制
SELECT firstname, teacherlastName
FROM tblstudents 

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

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

有人能在这里给我一个指针吗?我试着放括号,但没看到,想帮忙。

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-22 10:28:28

您不使用INNER JOIN,而只使用另一个LEFT JOIN

将tblStudents作为您的基础。你想得到所有的信息,而不是过滤掉任何东西,只附加可选的信息。使用第一个左联接,您可以附加第一个信息。

学生-> TeacherAssignment

TeacherAssignment可以是空的,也可以是非空的。现在你只需要附上另一个信息--老师的全名从tblTeachers上删除。

学生-> TeacherAssignnent -> TeacherName

使用另一个LEFT JOIN执行此操作。它在可能的情况下附加信息,即TeacherAssignment不为空的位置。这将忽略TeacherAssignment为null的行。

票数 1
EN

Stack Overflow用户

发布于 2013-11-22 10:19:21

您可以将INNER JOIN移动到子查询。

代码语言:javascript
复制
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子句。

代码语言:javascript
复制
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子句:

代码语言:javascript
复制
SELECT  firstname, teacherlastName
FROM    tblstudents 
        LEFT JOIN [tblStudentRakazot] 
            ON tblstudents.studentid = [tblStudentRakazot].studentID 
        LEFT JOIN tblteachers 
            ON [tblStudentRakazot].teacherid = tblteachers.teacherID
票数 1
EN

Stack Overflow用户

发布于 2013-11-22 10:38:12

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20142266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档