在外连接上(在这种情况下,让我们采用左外连接)如何在右侧表上添加过滤器?
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'
如何解释?
谢谢
答案 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运算符。