2011-12-21 126 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