ROWNUM
is raar omdat het kan worden geëvalueerd als onderdeel van een voorwaarde in de query - maar als de rij dat filter dan niet doorstaat, wordt de ROWNUM
waarde die eraan was toegewezen, wordt beschikbaar om opnieuw te worden gebruikt voor de volgende rij.
Een belangrijk effect hiervan is dat als u een voorwaarde gebruikt die een ROWNUM
uitsluit, waarde van 1, je krijgt nooit een match. De eerste rij die aan deze voorwaarde wordt getoetst, is rij 1; maar dan zal het de test niet doorstaan, dus de volgende rij wordt dan als rij 1 beschouwd; enzovoort.
Dus je conditie ROWNUM BETWEEN 2 AND 4
kan nooit waar zijn.
De oplossing die u hebt gevonden, is de traditionele. Een andere mogelijkheid is om een analytische functie te gebruiken om de rijen te rangschikken en vervolgens op de rangorde te filteren, bijvoorbeeld:
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;
Verschillende analytische functies - RANK, DENSE_RANK en ROW_NUMBER - kunnen voor dit doel worden gebruikt en zullen enigszins andere resultaten opleveren, vooral als er verbanden zijn. Bekijk de documenten.