SQL左连接和条件

时间:2014-10-27 17:09:37

标签: sql left-join

SELECT 
    A.RowId
FROM 
    dbo.Rows A
    LEFT JOIN dbo.SpecialRows B ON A.RowId = B.RowId AND B.ExcludeRowId > 0
WHERE
    A.FileId = 55
    AND A.Active = 1
    AND A.ExcludeRowId = 0
    AND B.RowId IS NULL /* This is to perform EXCEPT like operation */

朋友,这是我的查询,我有几个相关的问题。

Q1)假设我有另一个与此相同的查询,除了前三个条件被移动到LEFT JOIN的ON子句。 它会生成相同的结果集吗?

Q2)一般来说,如果我使用LEFT JOIN,那么与右边表相关的所有条件(在这种情况下都是dbo.SpecialRows)必须在ON子句中,这是正确的吗?

Q3)另外如果我在WHERE子句或ON子句中放置与左侧表相关的条件(在这种情况下是dbo.Rows),那么结果集将是相同的,这是正确的吗?

请解释一下,谢谢!

1 个答案:

答案 0 :(得分:2)

问题1

  • 不,它会有不同的结果集。
  • 您将获得A的所有行,只有满足所有条件的B行

问题2

  • 一般是的。有意见认为可能存在某些情况。
  • 如果您不小心,如果您在WHERE子句中检查一个不考虑NULL条件的值的条件,则可以将LEFT JOIN转换为INNER JOIN

问题3

  • 详见问题1答案
  • 如果A上的条件在WHERE中,那么无论B的影响如何,您只能获得符合这些条件的A行
  • 如果A上的条件为ON,那么您将获得A的所有行,然后只有与B中的条件匹配的B行,即使它们仅针对A