ROWNUM není skutečný sloupec, ale pseudo sloupec, který je k dispozici v dotazu. ROWNUM je číslo od jedničky po N, kde N je počet záznamů vrácených dotazem a toto číslo je přidáno záznamu ještě předtím, než proběhne část ORDER BY. ROWNUM je pouze dočasné číslo. ROWNUM je navýšeno teprve poté, co je přiřazeno záznamu a vyhodnocena podmínka v WHERE části.
select * from table_name where rownum > 1
Nevrátí žádný záznam. První zázname má ROWNUM 1. Vyhodnocení WHERE ROWNUM > 1 je tedy false. ROWNUM se nenavýší a tím pádem tato podmínka nebude nikdy splněna.
select * from table_name where rownum >= 1
Vrátí všechny záznamy.
select * from table_name where rownum < 5
Vrátí první 4 záznamy.
select t.*, rownum from table_name t order by t.column_name
Nejdříve přiřadí ROWNUM jednotlivým řádkům a teprve poté seřadí výstup. Je pravděpodobné, že ROWNUM budou rozházená a případná podmínka WHERE ROWNUM < cislo
by vrátila sice správný počet záznamů, ale neseřazeně. Řešením je následující select.
select rownum, t.* from ( select * from table_name order by column_name) t where rownum <= 5
Vrátí prvních pět výsledků dle řazení.
Pomocí ROWNUM je možné výsledek dotazu stránkovat, avšak je třeba použít ještě jeden select.
select * from ( select rownum as cisla_radku, t.* from ( select * from table_name order by column_name) t ) where cisla_radku between 10 and 15;
Vrátí desátý až patnáctý záznam (dle řazení) včetně. Podmínku WHERE je možné samozřejmě použít i ve vnořeném selectu.
select * from ( select rownum as cisla_radku, t.* from ( select * from table_name where nejaka_podminka order by column_name) t ) where cisla_radku between 10 and 15;
Zdroje: