ROWNUM v Oracle

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:

Napsat komentář