在简化的租赁系统中,有三种关系:
每本书都有很多副本。如果客户租借图书,则会选择可用的副本并创建相应的预订记录。
现在我的问题:客户选择一本书,他/她想租。系统需要检查,在给定的租赁期内可以使用哪些副本。
查询可用副本的最优雅,最快捷的方式是什么?
基本上,一步一步将执行以下操作:
第3步令我头疼。如何在SQL中执行此操作?我是否可以在一个优雅的查询中执行所有三个步骤?
答案 0 :(得分:2)
假设你有bookid。您正在寻找:
select c.*
from copies c
where not exists (select 1
from booking b
where b.copy_id = c.id and
b.rent_until >= @PeriodStart and b.rent_from <= @PeriodEnd
);
这是检查重叠时间段。如果预订在期间开始后结束并且预订在期间结束之前开始,则会有重叠。比较可能是<
和>
,具体取决于是否可以在rent_until
日期租借图书,或者是否必须等到第二天。