【问题标题】:Adding a WHERE clause to a JOIN statement将 WHERE 子句添加到 JOIN 语句
【发布时间】:2011-12-21 11:46:52
【问题描述】:

我有 2 张桌子,员工和假期。

在查看今年输入的假期后,我正在尝试选择员工列表、他们允许的假期和剩余假期。

表格如下所示(仅显示重要行)

employees
    id,
    name,
    allowed_holiday

holiday
    id,
    employee,
    num_days,
    date_to

我的当前查询可以很好地找到这些值,但我想添加一个 WHERE 子句,以便仅在 date_to > xxxx-09-01 AND

    SELECT 
        e.id,
        e.name,
        e.allowed_holiday,
        (e.allowed_holiday - SUM(h.num_days)) AS remaining
    FROM
        employees AS e
    LEFT JOIN 
        holiday AS h
    ON
        h.employee = e.id
    GROUP BY
        e.name
    ORDER BY 
        e.name ASC

我不确定在哪里添加 WHERE 子句,尽管它不会从没有列出假期的数据中删除员工。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    当您进行 LEFT 联接时,过滤条件必须在 ON 语句上。所以在你的情况下,它看起来像这样:

    SELECT 
        e.id,
        e.name,
        e.allowed_holiday,
        (e.allowed_holiday - SUM(h.num_days)) AS remaining
    FROM
        employees AS e
    LEFT JOIN 
        holiday AS h
    ON
        h.employee = e.id AND h.to_date between xxxx-09-01 and xxxx-09-01
    GROUP BY
        e.name
    ORDER BY 
        e.name ASC
    

    【讨论】:

    • 虽然可以将条件添加到 INNER 连接作为 WHERE 子句,但我个人更喜欢将它们添加到 ON 语句中,以匹配 LEFT 和 RIGHT 连接语句。但是,对 man 表的过滤器必须在 WHERE 语句中,所以看起来有点奇怪。这就是为什么我更喜欢 ORACLE 的方法。
    【解决方案2】:

    h.date_to 上的条件添加到ON 子句而不是WHERE 以避免将其转回INNER JOIN

      LEFT JOIN 
            holiday AS h
        ON
            h.employee = e.id AND h.date_to > ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多