2011-07-21 12 views
2
SELECT id 
     FROM ( 
SELECT id 
     FROM table  
     WHERE 
     PROCS_DT is null 
     ORDER BY prty desc, cret_dt) where rownum >0 and rownum <=100 

上記のクエリはオラクルを選択し、予想通りのクエリのヘルプしてください

SELECT id 
      FROM ( 
    SELECT id 
      FROM table  
      WHERE 
      PROCS_DT is null 
      ORDER BY prty desc, cret_dt) where rownum >101 and rownum <=200 

が、なぜ上記のクエリは私にゼロレコードを返すバック100件のレコードを私に与えていますか?

私は何かを続けることができますか?私は...

+0

サブクエリに100以上の行がありますか? –

+0

サブクエリはselectです* 10k行を引き出します – Shiv

答えて

3

はこれをOracleでダム試しています:

SELECT id 
FROM 
    (SELECT id, 
      rownum AS rn 
    FROM 
    (SELECT id 
     FROM TABLE 
     WHERE PROCS_DT IS NULL 
     ORDER BY prty DESC, cret_dt)) 
WHERE rn >101 
    AND rn <=200 

あなたは分析関数を使用して慣れている場合は、これを試してみてください。

SELECT id 
    FROM 
    (
     SELECT id, 
       ROW_NUMBER() OVER(ORDER BY prty DESC, cret_dt) rn 
      FROM table 
     WHERE procs_dt IS NULL 
    ) 
WHERE rn >101 and rn <=200 
+0

101-200にIDを渡すことはできません。データベースをチェックすることができます...(これは以前に注文されていません)...あなたもaliseと一緒に殻を適用する必要がありますと中のクエリを取る必要があります。 –

+0

@ Pratik:どのクエリを参照していますか? – Chandu

+0

申し訳ありませんが、私は何らかのエラーについて話しています.. 2週間前にこの種の行を取得しようとしていましたが、 この種類の同じクエリを取得できませんでした。 –

3

そのままROWNUMの値は行に割り当てられていますクエリ(またはサブクエリ)から返されます。行が戻されない場合、ROWNUM値はまったく割り当てられません。 ROWNUM値は常に1から始まり、各行に対して1ずつ増えます。

(これらの値は前にいずれかがあなたのケースであなたはサブクエリ外ROWNUMのチェックする必要があります理由です。ORDER BY節で示さソートに割り当てられていることに注意してください。)

ロジックの奇数ビット、あなたが理解しなければなりませんROWNUMに述語があるときは、その行がフィルタを通過する場合にのみ存在する値をフィルタリングします。概念的には、Oracleは最初に問合せに他のフィルタを適用し、ROWNUM 1を最初に一致する行に暫定的に割り当て、ROWNUMのフィルタと照合します。このチェックに合格すると、そのROWNUM値が返され、次の行にROWNUM 2が一時的に割り当てられます。ただし、チェックに合格しなかった場合は、その行は破棄され、同じROWNUM値が一時的に次の行。

したがって、ROWNUMのフィルタが1の値を受け入れない場合、フィルタを通過する行はありません。

他の回答に示されている解析関数ROW_NUMBER()の使用はこれを回避する方法です。この関数は、指定された順序に基づいて行番号(ROWNUMとは異なる)を明示的に割り当てます。ただし、オプティマイザは、問合せを完了するために常に可能な行に数値を割り当てることを避けることができるとは必ずしも認識していないため、パフォーマンスが大幅に変化する可能性があります。

あなたが欲しいものをやっての伝統的なROWNUMベースの方法がある:

SELECT id 
      FROM (
    SELECT rownum rn, id 
    FROM (
    SELECT id 
      FROM table  
      WHERE 
      PROCS_DT is null 
      ORDER BY prty desc, cret_dt 
    ) where rownum <=200 
) where rn > 101 

最も内側のクエリは、概念的に一致するすべての行を検索し、それらをソートします。次のレイヤーはこれらにROWNUMを割り当て、最初の200個のマッチだけを返します。 (そして、実際には、OracleオプティマイザはROWNUMフィルタが後に続くソートの重要性を理解し、他の行の特定の順序を気にせずに上位200行を識別する方法でソートを行います)

また、中間層は割り当てられたROWNUMを取り、結果セットの一部としてエイリアス "rn"を返します。これにより、最外層がその値をフィルタリングして下限を確立することが可能になる。

このバリアントと分析関数を使用して、どちらの方が効果的かを確認します。

+0

+1理由返されるROWNUM値は常に1から始まり、最後の行 –

関連する問題