Oracleは、クエリによって行が生成されるときにROWNUMに値を順番に割り当てます。したがって、フェッチされた最初の行はROWNUM =1を取得し、フェッチされた2番目の行はROWNUM =2を取得し、フェッチされた3番目の行はROWNUM=3を取得します。 ROWNUM =3を割り当てるには、先行する2つの行をフェッチする必要があります。そして、これがクエリが行を返さない理由です。データベースにフェッチされた3番目の行を要求していますが、行1と2はフェッチされていません。
実例を示すために、次のクエリを実行してみてください。
SELECT S.* FROM SALARY S; -- Should return all rows
SELECT ROWNUM, S.* FROM SALARY S; -- Should return all rows with ROWNUM prepended
SELECT ROWNUM, S.* FROM SALARY WHERE ROWNUM=3; -- Should return no rows
問題を回避するには、次のことを試してください。
SELECT ROW_NUMBER FROM
(SELECT ROWNUM AS ROW_NUMBER, S.* FROM SALARY S)
WHERE ROW_NUMBER = 3;
共有してお楽しみください。