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

10-90 指定サイズを下回るまでdelete

SQLパズル

画像テーブル
画像番号  画像サイズ
--------  ----------
       1           1
       2           2
       3           3
       4           4
       5           5
       6           6
       7           7
       8           8
       9           9
      10          10
      11          11
      12          12
      13          13

画像サイズの総合計が30を下回るまで、
画像番号の小さい順にレコードをdeleteする

更新結果
画像番号  画像サイズ
--------  ----------
      12          12
      13          13


データ作成スクリプト

create table 画像(
画像番号   number(2),
画像サイズ number(2));

insert into 画像
select RowNum,RowNum from all_catalog where RowNum <=13;
commit;


SQL

--■■■相関サブクエリを使う方法■■■
delete from 画像
 where RowID not in(
select a.RowID
  from 画像 a
 where (select nvl(sum(b.画像サイズ),0) + a.画像サイズ
          from 画像 b
         where b.画像番号 > a.画像番号) < 30);

--■■■分析関数を使う方法■■■
delete from 画像
 where RowID not in(
select Row_ID
  from (select RowID as Row_ID,
        sum(画像サイズ) over(order by 画像番号 desc) as サイズ累計
        from 画像)
 where サイズ累計 < 30);


解説

画像番号の降順に、
画像サイズの累計を取得してます