1

単純化されたレンタル システムには、次の 3 つの関係があります。

  • 本: ID、タイトル、説明
  • コピー: id、book_id
  • 予約: id、copy_id、rent_from、rent_until

各本には多くのコピーが存在します。顧客が本をレンタルすると、利用可能なコピーが選択され、対応する予約レコードが作成されます。

今私の問題: 顧客が本を選択し、彼/彼女は借りたいと思っています。システムは、指定されたレンタル期間に利用できるコピーを確認する必要があります。

利用可能なコピーを照会する最もエレガントで最速の方法は何ですか?

基本的に、段階的に次のことを行います。

  1. 対応する本のすべてのコピーを選択します
  2. それらのコピーの指定された期間内のすべての予約を選択します
  3. 選択した予約に含まれていない本のコピーを確認します。すべてのコピーが含まれている場合、その本は指定された期間にレンタルできません

ステップ3で頭痛がします。SQLでこれを行う方法は? 1 つの洗練されたクエリで 3 つの手順すべてを実行できるでしょうか?

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 に答える