oracleページング問題解決策

2984 ワード

昨日プロジェクトを終えた後、テストをさせました.テストでは、ページングクエリーが役に立たないようで、4ページ目をめくった後、見たデータの結果は同じです.その时、私はとても退屈で、あり得ません.ページングコンポーネントは良いはずですが、どうして問題があるのでしょうか.疑問を持って、私は自分のideを開けて、自分の機械の上で走って、やはり問題があります.問題があれば、まず2つのクエリーの結果が同じsqlをデータベースに印刷して実行します:sql 1:
 
  
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t
where rownum < 25)
where rn >= 19
sql2:
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t
where rownum <18)
where rn >= 12

結果は、ほとんどのローが同じであることを示します.
問題点を見つけるためには,まず一歩sqlを簡略化し,どのステップで問題が発生するかを見るしかない.
そこで見つけたのは、where rownum<18に問題が発生したときにデータが変わったのに、なぜwhere条件を付けると結果が変わるのかということです.
意味が分からない....
仕方がない、baiduしかない、baiduは半日も、誰も説明してくれなかった....
それから同僚は、書き方を変えてみると、次のように別の書き方を変えました.
 
  
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t)m
where m.rn >= 1 and m.rn <25

この方法はやはり効果があって、効果があって効果があって、肝心なのはどうして前のあのような方法がだめですか?問題をつかむには根掘り葉掘り聞かなければならない.
baiduはだめだと思いますが、googleで検索しなければなりません.Google検索はいつもchina governmentの壁に落ちるのが好きで、仕方なく、ネット上でchromeプラグインを探してやっと解決しました.
探して探して探して、oracleのask tomの上で、tomは詳しくrownumの使い方を紹介して、ここでhttp://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
One important thing about using this pagination query is that the ORDER BY statement should order by something unique. If what you are ordering by is not unique, you should add something to the end of the ORDER BY to make it so.
このような言葉を見ると、order byを使うときはorder byの唯一性を増やす必要があります.そうしないとrownumに問題があります.わあはははは、とても楽しくて、工夫は心の人を必要としないで、問題の結末を見つけて、もちろんよく解決しました.
これは間違いの経験だと思いますが、ここに記録しておきます.googleはbaiduよりずっと強いようですね.これから英語をよく勉強しなければなりません.そうしないと、問題が解決しません.