Oracle 12c / Top N řádků, stránkování
Top N řádků
Omezení seřazených dat podle počtu řádků se ve starších verzích muselo realizovat vnořeným dotazem. Ten tabulku nejprve uspořádal a až poté bylo možné odfiltrovat počet.
SELECT *
FROM (
SELECT last_name
, salary
FROM employees
ORDER BY salary DESC
)
WHERE (ROWNUM<=2)
;
Oracle 12c začleňuje syntax normy ANSI/ISO SQL:2008. Použít lze jak formát ROWS ONLY, který vrací přesný počet řádků, tak i ROWS WITH TIES, kde pokud následující řádky po řádku posledním obsahují duplicity, vrátí se i tyto.
SELECT last_name
, salary
FROM employees
ORDER BY salary
FETCH FIRST 2 ROWS ONLY
;
SELECT last_name
, salary
FROM employees
ORDER BY salary
FETCH FIRST 2 ROWS WITH TIES
;
Top N procent řádků
Podobnou konstrukci lze využít i pro procentuální podíl řádků.
SELECT last_name
, salary
FROM employees
ORDER BY salary
FETCH FIRST 2 PERCENT ROWS ONLY
;
Stránkování
Ještě méně přehledný složený dotaz byl dříve zapotřebí pro stránkování. Nejdříve seřazení, poté omezení horní hranice a na závěr omezení zespodu.
SELECT last_name
, salary
FROM (
SELECT e.*
, ROWNUM AS start_from
FROM (
SELECT *
FROM employees
ORDER BY salary
) e
WHERE (ROWNUM<=4)
)
WHERE (start_from>2)
;
Nový přístup je nesrovnatelně jednodušší. Oba příklady vrací třetího a čtvrtého zaměstnance s nejmenším platem.
SELECT last_name
, salary
FROM employees
ORDER BY salary
OFFSET 2 ROWS
FETCH NEXT 2 ROWS ONLY
;