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

10-62 先頭N件をロック

SQLパズル

テーブル
Col1  Col2
----  ----
   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
  14    14
  15    15

Col1の昇順に10レコード取得し、
for updateでロックする

出力結果
Col1  Col2
----  ----
   1     1
   2     2
   3     3
   4     4
   5     5
   6     6
   7     7
   8     8
   9     9
  10    10


データ作成スクリプト

create table テーブル(
col1 number(3),
col2 number(3),
primary key(col1));

begin
    for i in 1..15 Loop
        insert into テーブル values(i,i);
    end Loop;
    commit;
end;
/


SQL

--■■■相関サブクエリを使う方法■■■
select col1,col2 from テーブル a
 where (select count(b.col1)+1 from テーブル b
         where b.col1 < a.col1) <= 10
for update nowait;

--■■■インラインビューでソートする方法■■■
select col1,col2
  from テーブル
 where RowID in (select Row_ID
                   from (select RowID as Row_ID from テーブル order by col1)
                  where RowNum <= 10)
for update nowait;

--■■■分析関数を使う方法■■■
select col1,col2 from テーブル a
 where RowID in (select Row_ID
                   from (select b.RowID as Row_ID,
                         Row_number() over(order by b.col1) as Rank
                           from テーブル b)
                  where Rank <= 10)
for update nowait


解説

where句で、順位が10位以内かチェックしてます

レコード数が多い場合は、
RowNum指定によるCountStopを併用してもいいでしょう