我正在使用包含表Schedule
的数据库。
schedule_id | taf_id | active | start_date | end_date
1 | -1 | 1 |"2017-08-27"|"2017-09-01"
2 | 23 | 1 |"2018-01-01"|"2018-01-05"
3 | 134 | 1 |"2018-01-03"|"2018-02-01"
如果Schedule表中的一行在TAF表中有相应的行,那么taf_id
字段的值将不为-1。
TAF表中的行将始终在“修订”表中具有相应的行。并且Revision表中的行将始终在Booking表中有3个对应的行。
以前通过首先为两个给定日期之间的员工选择所有活动计划行,然后对计划中taf_id大于-1的每行进行单独的数据库查询来获取所有这些数据。但是,所有这些调用的开销太大了。
为了加快这次通话速度,我希望通过此次通话立即获取所有信息:
SELECT * FROM Schedule
LEFT JOIN TAF ON TAF.taf_id=Schedule.taf_id
LEFT JOIN Revision ON Revision.revision_id=TAF.revision_id
RIGHT JOIN Booking ON Booking.revision_id=Revision.revision_id
WHERE Schedule.employee_id=<EMPLOYEES_ID>
AND Schedule.active
AND Schedule.start_date<=<END_DATE> AND Schedule.end_date>=<START_DATE>
ORDER BY Schedule.start_date;
此调用为每个选定的Schedule
行返回三行,但可以忽略冗余数据。但是,现在我无法从Schedule
表中获得任何等于-1的taf_id
字段的行。我知道LEFT JOIN只会给我空字段,所以它必须是排除这些Schedule行的RIGHT JOIN命令。
有没有办法使用RIGHT JOIN命令来包含没有任何内容可以加入的行,或者我是否以错误的方式进行此操作?有没有其他方法来查询一对多的关系,其中“很多”可能是什么?
以下是数据库模拟版本的链接:http://sqlfiddle.com/#!9/d925be/14