トップページに戻る
次の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を併用してもいいでしょう