2013-08-28 47 views
1

在一個簡化的租賃系統的結果存在,有三個關係:檢查一組鍵的設置

  • 書:ID,標題,描述
  • 複製:ID,book_id
  • 預訂:id,copy_id,rent_from,rent_until

對於每本書都有很多副本。如果客戶出租書籍,則選擇可用副本並創建相應的預訂記錄。

現在我的問題:客戶選擇一本書,他/她想租。系統需要檢查哪些副本可用於給定的租期。

什麼是查詢可用副本最優雅和最快的方式?

基本上,一步一步的人會做到以下幾點:

  1. 選擇相應的書
  2. 的所有副本的副本
  3. 檢查規定的期限選擇所有預訂這些文件的副本該書不包含在選定的預訂中。如果包含所有副本,則該書在給定期限內不可用於出租

第3步給我頭痛。如何在SQL中做到這一點?我甚至可以在一個優雅的查詢中執行所有三個步驟?

回答

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日期租用書籍,或者是否必須等到第二天。