选择与另一个表具有一对多关系的行,但也包括与该表没有关系的行

时间:2018-01-31 20:42:31

标签: mysql sql

我正在使用包含表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

0 个答案:

没有答案