2016-04-19 14 views
1

我有三個表格:日曆,僱員,任務。 員工通常在一週內完成任務,並且在週末期間不工作。我想完成的是加入表格,所以即使沒有員工完成任何任務,我也會在一年中每天看到。如何連接表以查看空值的日期?

下面是對我的作品的SQL:

SELECT c.date, t.task, e.name 
FROM calendar c 
    LEFT JOIN tasks t ON (c.date = t.date) 
    INNER JOIN employees e ON (t.emp_id = e.id) 
WHERE c.date >= "2016-01-01" AND c.date <= "2016-01-07"; 

一個結果是這樣的:

Date   Task  Name 
... 
2016-01-05 Driving John 
2016-01-05 Cooking Rob 
2016-01-06 Installing Jane 
2016-01-07 null  null 

我的問題是,當我添加一個員工進入WHERE條款(WHERE e.name in("John", "Rob", "Jane"))最後一行(2016-01-07 null null)消失。

我應該改變甚麼以保持結果中沒有員工和任務的日期?我需要這些日期來保留最終報告。

+1

爲什麼這個奇數? ('... AND c.date <=「20016-01-07」') – jarlh

+0

我不認爲這個查詢可以返回上述結果。 – Strawberry

+0

感謝您的意見,我在日期修復了錯誤 – StefanK

回答

1

這裏的其他答案是正確的。將內部連接變爲左連接以返回沒有員工的日子然後

WHERE c.date between "2016-01-01" and "2016-01-07" 
AND (e.name in("John", "Rob", "Jane") or e.name is null) 
+0

謝謝,這個工作就像我想要的:) – StefanK

1

將員工的內部連接更改爲左連接,並將名稱篩選器置於連接子句中,而不是where子句。

+0

謝謝,我不知道我可以修改左連接以包含查詢的過濾器。這意味着,這也適用。 – StefanK

0

記住要修復該日期;

SELECT c.DATE 
    ,t.task 
    ,e.NAME 
FROM calendar c 
LEFT JOIN tasks t ON (c.DATE = t.DATE) 
LEFT JOIN employees e ON t.emp_id = e.id 
    AND e.NAME IN ('John' ,'Rob','Jane') 
WHERE c.DATE >= "2016-01-01" 
    AND c.DATE <= "2016-01-07";