2011-12-21 158 views
2

我有2个表,员工和假期。向JOIN语句中添加WHERE子句

我想选择一个员工名单,他们允许的假期和剩余的假期后,看看今年输入的假期

的表格看起来像这样(只显示重要行)

employees 
    id, 
    name, 
    allowed_holiday 

holiday 
    id, 
    employee, 
    num_days, 
    date_to 

我有一个发现这些值精细当前的查询,但我想添加一个WHERE子句只能算假期对员工如果DATE_TO > xxxx-09-01 AND < xxxx-09-01。

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子句,但不删除没有假期列出的数据的员工。

回答

1

h.date_to添加条件到ON条款不WHERE避免把它放回了INNER JOIN

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

当你正在做一个LEFT JOIN,过滤条件必须在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 
+0

虽然这是可能的条件下加入到内部联接的WHERE子句,我个人更喜欢将它们添加在ON语句只是为了配合德左,右连接语句。但是,对于man表的过滤器必须在WHERE语句中,所以它看起来有些奇怪。这就是为什么我更喜欢ORACLE的方法。 – 2011-12-21 11:55:21