1

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はどのようにエントリを順序付けますか?ページを切り替えるときに結果が安定するように、ページングの順序をほぼ定義する必要があります。

4

1 に答える 1

0

orderby が適用される前に内部クエリで割り当てられた rownum から派生した列エイリアス "rn" を参照しています。

代わりに、外側のクエリで rownum を参照してください。

select *
from (
  select   *
  from     ...
  order by ...
) 
where rownum between 1 and 30;

または ...

ちなみに、rownum 0 は存在しません。

select *
from (
  select   a.*, rownum rn
  from (
    select   *
    from     ...
    order by ...
    ) a
  where rownum < 60
) 
where rn >= 30
于 2012-05-30T13:53:39.583 に答える