1

在简化的租赁系统中,存在三个关系:

  • 书籍:id,标题,描述
  • 复制:id,book_id
  • 预订:id、copy_id、rent_from、rent_until

每本书都有许多副本。如果客户租用一本书,则选择可用副本并创建相应的预订记录。

现在我的问题:客户选择一本书,他/她想租。系统需要检查在给定的租期内哪些副本可用。

查询可用副本的最优雅和最快的方法是什么?

基本上,一步一步将执行以下操作:

  1. 选择相应书籍的所有副本
  2. 选择那些副本的指定期间内的所有预订
  3. 检查哪些书籍的副本未包含在选定的预订中。如果包括所有副本,则该书在给定期间不可出租

第 3 步让我头疼。如何在 SQL 中做到这一点?我什至可以在一个优雅的查询中执行所有三个步骤吗?

4

1 回答 1

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日期租借,或者是否必须等到第二天。

于 2013-08-28T02:39:09.803 回答