ROWNUM
クエリの条件の一部として評価できるという点で奇妙ですが、行がそのフィルタを通過できなかった場合、ROWNUM
割り当てられた値は、次の行で再び使用できるようになります。
これの重要な効果の1つは、ROWNUM
を除外する条件を使用する場合です。 値が1の場合、一致することはありません。この条件に対してテストされる最初の行は行1になります。ただし、テストに失敗するため、次の行は行1と見なされます。など。
したがって、あなたの状態はROWNUM BETWEEN 2 AND 4
決して真実になることはできません。
あなたが見つけた回避策は伝統的なものです。もう1つは、分析関数を使用して行をランク付けし、ランクでフィルタリングすることです。例:
SELECT MI.* FROM (
SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
FROM ELEC_AUTO_MERC
) MI
WHERE the_rank BETWEEN 2 AND 4;
いくつかの分析関数(RANK、DENSE_RANK、およびROW_NUMBER)をこの目的に使用でき、特に同点の場合、わずかに異なる結果が生成されます。ドキュメントを確認してください。