Sql 使用存储在另一个表中的id和日期范围从一个表中获取数据

Sql 使用存储在另一个表中的id和日期范围从一个表中获取数据,sql,Sql,我正在编写的应用程序适用于出租给客户的遥测设备,我正在尝试查询特定客户的记录数据,而在Log表中没有customer\u id\u fk列 我有以下表格: 客户表: id | name | ... 单位表: id | name | ... 出租表: id | start_date | end_date | unit_id_fk | customer_id_fk 日志表: id | unit_id_fk | datetime | data1 | data2 Log表中没有包含custome

我正在编写的应用程序适用于出租给客户的遥测设备,我正在尝试查询特定客户的记录数据,而在
Log
表中没有
customer\u id\u fk

我有以下表格:

客户表:

id | name | ...
单位表:

id | name | ...
出租表:

id | start_date | end_date | unit_id_fk | customer_id_fk
日志表:

id | unit_id_fk | datetime | data1 | data2

Log
表中没有包含
customer\u id\u fk
列的原因是租出表中的错误很容易纠正,而无需更改
Log
表中的数据(尽管可能有更好的方法?)

将客户包含在日志表中会更有效。但是,如果没有这些,您可以通过一系列连接获得您想要的:

select l.*, c.*
from log l left outer join
     RentOut ro
     on l.unit_id_fk = ro.unit_id_rk and
        l.datetime between ro.start_date and ro.end_date left outer join
     Customer c
     on ro.customer_id = c.id
where c.<whatever> = <foobar>
选择l.*,c*
从日志l左外连接
出租ro
在l.unit\u id\u fk=ro.unit\u id\u rk上,以及
l、 ro.start_日期和ro.end_日期之间的日期时间左外联接
客户c
在ro.customer_id=c.id上
其中c=

如果租出表中的日期实际上是日期(没有时间),并且日志记录有一个datetime,那么您可能需要执行更多的日期算法才能使联接正常工作。例如,对于给定的日志记录,您可能需要说“开始”实际上在中午之后,“结束”实际上在中午之前。

我预测每年日志表中大约有300万行,您认为上面的查询是个坏主意吗?可能性能影响更多地与出租表中的行数有关?@Flo。这是相当数量的数据。确保在
租出(单位id、开始日期、结束日期)
和所有表的主键上设置了索引。这应该有助于提高绩效。