【问题标题】:Adding filter on the right side table on Left outer joins在左侧外连接的右侧表上添加过滤器
【发布时间】:2014-02-01 13:47:44
【问题描述】:

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

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'

谢谢

【问题讨论】:

  • 取决于过滤器在 JOIN 条件或 WHERE 子句中的应用位置。
  • @user2989408 过滤器应用于 JOIN 条件,如示例所示。
  • 在选择前输入 EXPLAIN 以查看查询计划

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


【解决方案1】:

应该与:

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

【讨论】:

  • 另外,如果需要,可以提供一些例子。
  • 这是正确答案:右侧表的静态联接条件是联接前表上的过滤器。我在样本数据上对此进行了测试以确定。 Adam 的观点是正确的,但现在 i.name 已添加到示例中的选择中,这就回答了连接条件如何改变连接右侧的问题。
【解决方案2】:

在您的示例查询中,只会返回 i.name = 'John' 的行。我认为您还想包含 or i.name is 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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的解释。
    【解决方案4】:

    这也可以使用 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 连接运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      相关资源
      最近更新 更多