在左外连接的右侧表上添加过滤器

时间:2014-01-13 17:31:51

标签: sql sql-server join left-join right-join

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

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 个答案:

答案 0 :(得分:8)

应该与:

相同
SELECT s.id FROM Student s 
LEFT OUTER JOIN (Select * from Student_Instructor where name='John' ) i
ON s.student_id=i.student_id

答案 1 :(得分:1)

在示例查询中,只返回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

答案 2 :(得分:1)

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

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

如果是内连接,只有满足连接过滤器才会返回行。

答案 3 :(得分: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 join运算符。