そのまま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"を返します。これにより、最外層がその値をフィルタリングして下限を確立することが可能になる。
このバリアントと分析関数を使用して、どちらの方が効果的かを確認します。
サブクエリに100以上の行がありますか? –
サブクエリはselectです* 10k行を引き出します – Shiv