ROWNUM
aneh karena dapat dievaluasi sebagai bagian dari kondisi dalam kueri - tetapi jika baris gagal melewati filter itu, ROWNUM
nilai yang ditetapkan menjadi tersedia untuk digunakan lagi untuk baris berikutnya.
Salah satu efek penting dari ini adalah jika Anda menggunakan kondisi apa pun yang mengecualikan ROWNUM
nilai 1, Anda tidak akan pernah mendapatkan kecocokan. Baris pertama yang akan diuji terhadap kondisi ini adalah baris 1; tetapi kemudian akan gagal dalam tes, sehingga baris berikutnya akan dianggap sebagai baris 1; dan seterusnya.
Jadi kondisi Anda ROWNUM BETWEEN 2 AND 4
tidak akan pernah benar.
Solusi yang Anda temukan adalah yang tradisional. Cara lainnya adalah menggunakan fungsi analitik untuk memberi peringkat pada baris, lalu memfilter peringkat tersebut, mis.:
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;
Beberapa fungsi analitik - RANK, DENSE_RANK, dan ROW_NUMBER - dapat digunakan untuk tujuan ini, dan akan menghasilkan hasil yang sedikit berbeda, terutama jika ada ikatan. Lihat dokumennya.