8

在外连接(在这种情况下让我们采用左外连接)在右侧表上添加过滤器如何工作?

SELECT s.id, i.name FROM Student s 
LEFT OUTER JOIN Student_Instructor i
ON s.student_id=i.student_id
AND i.name='John'

我知道,如果过滤器在Student表格上,它更像是“首先获取名称为 John 的所有行并加入表格”。

但我不确定过滤器是否在右侧表(Student_Instructor)上是否是这种情况。过滤器如何i.name='John'被解释?

谢谢

4

4 回答 4

11

应该与以下内容相同:

SELECT s.id FROM Student s 
LEFT OUTER JOIN (Select * from Student_Instructor where name='John' ) i
ON s.student_id=i.student_id
于 2014-01-13T17:44:13.767 回答
3

在您的示例查询中,只会返回 i.name = 'John' 的行。我认为您还想包含或 i.name 为 null以包含学生记录确实包含学生讲师的所有行。

SELECT s.id FROM Student s , isnull(i.name, 'No Student Insturctor') as [Student Instructor]
LEFT OUTER JOIN Student_Instructor i
ON s.student_id=i.student_id
AND i.name='John' or i.name is null
于 2014-01-13T17:44:33.550 回答
1

无论如何,所有行都将从您的左表返回。在左连接的情况下,如果不满足过滤器,则从右表返回的所有数据都将显示为空。在您的情况下,所有学生都将显示在您的结果中。如果学生没有讲师,则 i.name 将为空。

由于您只是从左表中选择一列,因此您的联接毫无用处。我还将 i.name 添加到您的选择中,这样您就可以看到结果

在内部连接的情况下,只有满足连接过滤器时才会返回行。

于 2014-01-13T18:01:37.517 回答
0

这也可以使用 Oracle (+) 表示法来完成 -

SELECT s.id FROM Student s, Student_Instructor i
WHERE s.student_id = i.student_id (+)
AND i.name(+)='John'

虽然,Oracle 建议您使用 FROM 子句 OUTER JOIN 语法而不是 Oracle 连接运算符。

于 2017-03-29T20:59:34.397 回答