ROWNUM
je zvláštní v tom, že jej lze vyhodnotit jako součást podmínky v dotazu – ale pokud řádek poté neprojde tímto filtrem, ROWNUM
hodnota, která byla přiřazena, bude k dispozici pro opětovné použití pro další řádek.
Jedním z důležitých efektů je, že pokud použijete jakoukoli podmínku, která vylučuje ROWNUM
hodnotu 1, nikdy nezískáte shodu. První řádek, který bude testován na tuto podmínku, bude řádek 1; ale pak test neprojde, takže další řádek bude považován za řádek 1; a tak dále.
Takže vaše podmínka ROWNUM BETWEEN 2 AND 4
nikdy nemůže být pravda.
Řešení, které jste našli, je tradiční. Dalším by bylo použít analytickou funkci k hodnocení řádků a poté filtrovat podle hodnocení, např.:
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;
K tomuto účelu lze použít několik analytických funkcí – RANK, DENSE_RANK a ROW_NUMBER – a poskytnou mírně odlišné výsledky, zejména pokud existují remízy. Podívejte se na dokumenty.