Oracleで次の2つのクエリを実行しています。
select B.* from (
select A.*, rownum as rn from (
select * from .... order by ...
) A ) B where B.rn > 0 and B.rn <=30;
と
select B.* from (
select A.*, rownum as rn from (
select * from .... order by ...
) A where rownum <= 30 ) B where rn > 0
実際、これらのクエリの結果は異なります。最初のものはより正確に見えます。なんで?
2番目のアプローチの問題は、0〜30の間隔で実行すると、一見問題ないように見えることです。しかし、30〜60の間隔で実行すると、30〜60の結果に、0〜30の結果ですでに見たエントリが含まれていることがわかりました(明らかに発生しないはずです)。
UPDorder by
:句が一意の並べ替えを生成しないため、おそらく正しく機能しない可能性があることがわかりました。したがって、PKではなく、たとえばclientNameでソートされ、結果には同等のクライアントが多数存在する可能性があります。それで、それが理由でしょうか?順序が実際に定義されていない場合、Oracleはどのようにエントリを順序付けますか?ページを切り替えるときに結果が安定するように、ページングの順序をほぼ定義する必要があります。