代码之家  ›  专栏  ›  技术社区  ›  Raúl Roa

在使用JOIN关键字时添加两个条件是一种好的做法吗?

  •  4
  • Raúl Roa  · 技术社区  · 16 年前

    我想知道在使用JOIN关键字时使用条件句是否是一种好的做法。

    SELECT
      Branches.Name
      ,SUM(Expenses.Amount) AS Expenses
      ,SUM(Incomes.Amount) AS Incomes
    FROM
      Branches
      LEFT JOIN Expenses
        ON Branches.Id = Expenses.BranchId AND Expenses.Date = '3/11/2010'
      LEFT JOIN Incomes
        ON Branches.Id = Incomes.BranchId AND Incomes.Date = '3/11/2010'
    GROUP BY Branches.Name
    
    6 回复  |  直到 16 年前
        1
  •  5
  •   Dewfy    16 年前

    为什么不呢?甚至更多! 关于这两个条件,外连接有非常特殊的技巧! 内部连接允许重组,例如,以下是等效的:

    INNER JOIN Expenses
        ON Branches.Id = Expenses.BranchId
    WHERE
        Expenses.Date = '3/11/2010'
    

    通过:

    INNER JOIN Expenses
        ON Branches.Id = Expenses.BranchId AND Expenses.Date = '3/11/2010'
    

    但是对于外部联接,必须在ON内部指定两个条件,因为WHERE将结果视为内部联接

        2
  •  2
  •   Daniel Vassallo    16 年前

    这是处理外部联接的正确方法。

    BranchId Date Expenses Incomes

        3
  •  0
  •   Scott Ivey    16 年前

    你做得对。在您的例子中,您希望筛选联接的右侧,因此日期条件属于联接。上面写着“给我所有的分支机构,只有那些收入和;符合我条件的费用。”

    当您将条件移动到WHERE子句时,您将查询的整个含义更改为“give me all branches and their income&费用,但前提是一切都符合我的条件。”

    这不是一个好的实践问题,而是数据库如何评估查询的设计问题。

        4
  •  0
  •   HLGEM    16 年前

        5
  •  0
  •   SqlRyan    16 年前

    • 满意结果集 ,这意味着空行(例如,在左联接中)将不匹配,并且将被排除。
    • 如果JOIN子句中有条件(左或右),则必须使用该条件 对加入感到满意 ,但不是在结果中。如果一行存在,它必须满足条件,但是SQL将允许外部连接作为匹配项计算,即使另一侧没有实际计算的值。

        6
  •  -1
  •   Tom H zenazn    16 年前

    我认为你应该把连接逻辑和过滤分开。

    SELECT
      Branches.Name
      ,SUM(Expenses.Amount) AS Expenses
      ,SUM(Incomes.Amount) AS Incomes
    FROM
      Branches
      LEFT JOIN Expenses
        ON Branches.Id = Expenses.BranchId
      LEFT JOIN Incomes
        ON Branches.Id = Incomes.BranchId
    WHERE ISNULL(Expenses.Date,'3/11/2010') = '3/11/2010'
    AND  ISNULL(Incomes.Date,'3/11/2010') = '3/11/2010'
    GROUP BY Branches.Name