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

4-6 select文の結果のレコード件数を取得

SQLパズル

Table46から、Col1が5の倍数のレコードのCol1、Col2、Col3と、
select文の結果のレコード件数を取得する。
こちらを参考にさせていただきました


データ作成スクリプト

create table Table46(
Col1 number(3),
Col2 number(3),
Col3 number(3));

begin
    for i in 1..100 Loop
        insert into Table46 values(i,i*3,i*4);
    end Loop;
    commit;
end;
/


SQL

--■■■相関サブクエリを使う方法■■■
select Col1,Col2,Col3,
(select count(*) from Table46 where mod(Col1,5)=0) as RecordCount
from Table46
where mod(Col1,5)=0;

--■■■count(*) over()を使う方法■■■
select Col1,Col2,Col3,
count(*) over() as RecordCount
from Table46
where mod(Col1,5)=0;

--■■■group byのあるSQLでも文法エラーが発生しません(参考までに)■■■
select mod(Col1,5),count(*),
count(*) over() as RecordCount
from Table46
group by mod(Col1,5);


解説

select句でcount(*) over()とすると、select文の結果件数を取得できます
group byのあるSQLでも文法エラーが発生しません。

JDBC経由でのselect文の、レコード件数の取得に限らず、
PL/SQLでのカーソルforループでの、レコード件数の取得にも使えます。

select count(*) from Table46 where mod(Col1,5)=0;
を発行してから
select Col1,Col2,Col3 from Table46 where mod(Col1,5)=0;
を発行する方法は、
アンリピータブルリードやファントムリードが発生した場合に、
select count(*) from Table46 where mod(Col1,5)=0;の結果と
select Col1,Col2,Col3 from Table46 where mod(Col1,5)=0;の取得件数が一致しない可能性があります。

トランザクションの並列処理時に発生する問題