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

3-6 空き時間を探索してinsert

SQLパズル

TimeTableのVal1(Date型)に、2005年8月1日16時20分を第一候補とした時間を登録する
ただし同一時刻の登録データは3件までとし、
既に3件のデータが存在した場合は、10分後の時刻を次の候補として処理を再帰的に行う


データ作成スクリプト

create table TimeTable(Val1 date);


SQL

insert into TimeTable(Val1)
values(
case when (select count(Val1) from TimeTable
            where Val1= to_date('2005/08/01 16:20','YYYY/MM/DD HH24;MI')
              and RowNum <= 3) < 3
     then to_date('2005/08/01 16:20','YYYY/MM/DD HH24;MI')
     else (select min(Val1) + 10/24/60 from TimeTable a
            where Val1 >= to_date('2005/08/01 16:20','YYYY/MM/DD HH24;MI')
              and (select count(b.Val1) from TimeTable b
                    where b.Val1=a.Val1 + 10/24/60
                      and RowNum <= 3) < 3)
     end);


解説

第一候補の時間に登録可能かを調べて、
登録可能の場合は、その時間となります

第一候補の時間に登録不可の場合は、Val1が最大のデータを番兵とした、
第一候補以降で登録可能な時間の探索を行います