トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-299 ミニミニ予約システムその2

SQLパズル

部屋テーブル
部屋ID  許容人数
------  --------
   101         1
   102         1
   103         1
   104         1
   201         2
   202         2

仮予約テーブル
予約ID  到着予定日   出発予定日  予約人数   予約完了フラグ   キャンセルフラグ
------  ----------  ----------  --------  --------------  ----------------
     1  2003/08/01  2003/08/03         2               Y              null
     2  2003/08/02  2003/08/03         2               Y              null
     3  2003/08/03  2003/08/04         2               Y              null
     4  2003/08/01  2003/08/04         2            null              null
     5  2003/08/04  2003/08/08         3               Y              null
     6  2003/08/04  2003/08/08         1               Y              null

予約状況テーブル
予約ID  部屋ID  到着予定日  出発予定日
------  ------  ----------  ----------
     1     201  2003/08/01  2003/08/03
     2     202  2003/08/02  2003/08/03
     3     201  2003/08/03  2003/08/04
     4     101  2003/08/01  2003/08/04
     4     102  2003/08/01  2003/08/04
     5     201  2003/08/04  2003/08/08
     5     101  2003/08/04  2003/08/08
     6     102  2003/08/04  2003/08/08

予約のキャンセルが発生したら、キャンセルフラグを'Y'にした上で予約状況から削除します。
さらに予約完了フラグが'Y'になっていないものがあれば
予約状況テーブルに反映する処理を再度行います。

以上の条件で、予約IDが1,2,3の予約がキャンセルされた場合の処理を記述する。


データ作成スクリプト

前のSQLパズルのデータ作成スクリプトとPL/SQLです


SQL

update 仮予約 set キャンセルフラグ = 'Y'
 where 予約ID in(1,2,3);

delete from 予約状況 a
 where exists(select 1 from 仮予約 b
               where b.キャンセルフラグ = 'Y'
                 and b.予約ID = a.予約ID);

前のSQLパズルの無名PL/SQLブロックを実行
(ただし、予約完了フラグとキャンセルフラグを見る必要がある)


解説

基本的なupdate文とdelete文となります。