Máte 4 otázky a všechny se točí kolem použití a funkcí ROWNUM . Odpovím na každou otázku jednu po druhé.
Proč (toto byl můj první pokus, dokud nebudu hledat na SO) Vyberte * Od osoby Kde rownum> 100 a rownum <110; vrátí 0 řádků?
Pěkné vysvětlení Thomase Kytea ohledně ROWNUM a stránkování zde.
A ROWNUM hodnota je přiřazena řádku poté, co projde fází predikátu dotazu, ale předtím, než dotaz provede jakékoli třídění nebo agregaci. Hodnota ROWNUM se také zvýší až po jejím přiřazení, což je důvod, proč následující dotaz nikdy nevrátí řádek:
select *
from t
where ROWNUM > 1;
Protože ROWNUM> 1 neplatí pro první řádek, ROWNUM se neposune na 2. Žádná hodnota ROWNUM tedy nikdy nebude větší než 1.
Proč neexistuje jednoduchý způsob, jak udělat něco jako Select ... FROM ... WHERE rownum BETWEEN lowerBound A upperBound?
Ano, tam je. Z Oracle 12c dále můžete použít nové omezení nejvyšších řádků Vlastnosti. Viz moje odpověď zde.
Například níže uvedený dotaz vrátí zaměstnance mezi 4. nejvyšší do 7. nejvyšších platů ve vzestupném pořadí:
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
Jak se zbavit sloupce r ve výsledných hodnotách?
Místo select *
, uveďte požadované názvy sloupců ve vnějším dotazu. Pro časté používání dotazu je vytvoření pohledu jednoduchou jednorázovou aktivitou.
Případně v SQL*Plus
můžete použít NOPRINT příkaz. Nezobrazí název sloupce, který nechcete zobrazit. Fungovalo by to však pouze v SQL*Plus.
Například,
COLUMN column_name NOPRINT
Například,
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;
DEPTNO
----------
10
20
30
40
SQL>
Zajišťuje správné stránkování?
Ano, pokud správně napíšete dotaz na stránkování.
Například,
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM t
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 5;
VAL
----------
3
3
4
4
4 rows selected.
SQL>
Nebo použijte novou funkci omezení řádků na 12c, jak jsem ukázal výše.
Zde je několik dobrých příkladů.