我有三个表:Resource、Timesheet、TimePeriod。一个资源有许多时间表,而一个时间表有一个 TimePeriod。这用于我们跟踪员工时间表。我试图弄清楚如何找出每个人本周时间表的状态。问题是,如果一个人没有填写时间表,那么时间表表中就不会有条目。所以他们的状态应该是NULL。
这是数据库的样子:
Resource
id | Name
---+------------
1 | John Smith
2 | Jason Bourne
Timesheet
id | Status | Resource_Id |TimePeriod_Id
---+-----------+-------------------------------
1 | Submitted | 1 | 1
2 | Created | 1 | 2
3 | Submitted | 2 | 1
TimePeriod
id | Week
---+----------------
1 | 2013Week1
2 | 2013Week2
3 | 2013Week3
如果 TimePeriod 存储在同一个表中,那么这将不是问题。但由于它在一个单独的表中,我认为我进行连接的方式存在问题。我无法弄清楚使这项工作正常进行的查询。
我试过这个:
SELECT res.id, res.name, ts.status
FROM Resource res
LEFT JOIN Timesheet ts ON ts.resource_id = res.id
LEFT JOIN TimePeriod tp ON ts.timeperiod_id = tp.id
WHERE tp.week = '2013Week2'
这显然从结果中排除了 Jason Bourne,因为他没有时间表
我也试过这个:
SELECT res.id, res.name, ts.status
FROM Resource res
LEFT JOIN Timesheet ts ON ts.resource_id = res.id
LEFT JOIN TimePeriod tp ON ts.timeperiod_id = tp.id AND tp.week = '2013Week2'
这会返回额外的行和错误的数据。
期望的结果是:
id name status
1 John Smith Created
2 Jason Bourne NULL
我相信我可以通过 UNION 偶然发现这一点,但我觉得应该有其他方法可以做到这一点。如果有人有任何建议,我将不胜感激。谢谢。