Имате 4 въпроса и всички се въртят около използването и функционалността на ROWNUM . Ще отговоря на всеки въпрос един по един.
Защо (това беше първият ми опит, докато не потърсих в SO) Изберете * От човек Където rownum> 100 и rownum <110; връща 0 реда?
Хубаво обяснение от Томас Кайт относно ROWNUM и пагинация тук.
AROWNUM стойност се присвоява на ред, след като премине предикатната фаза на заявката, но преди заявката да извърши някакво сортиране или агрегиране. Също така стойността ROWNUM се увеличава само след като е присвоена, поради което следната заявка никога няма да върне ред:
select *
from t
where ROWNUM > 1;
Тъй като ROWNUM> 1 не е вярно за първия ред, ROWNUM не преминава към 2. Следователно нито една стойност на ROWNUM никога не може да бъде по-голяма от 1.
Защо няма лесен начин да направите нещо като Избор ... ОТ ... КЪДЕ rownum МЕЖДУ lowBound AND upperBound ?
Да, има. От Oracle 12c нататък можете да използвате новото ограничение на най-горния ред отличителен белег. Вижте моя отговор тук.
Например, заявката по-долу ще върне служителите между 4-то най-високо до7-ма най-висока заплата във възходящ ред:
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>
Как да се отървем от колоната r в получените стойности?
Вместо select *
, избройте задължителните имена на колони във външната заявка. За често използване на заявката създаването на изглед е проста еднократна дейност.
Алтернативно, в SQL*Plus
можете да използвате NOPRINT команда. Той няма да покаже името на колоната, което не искате да показвате. Въпреки това, той ще работи само в SQL*Plus.
Например,
COLUMN column_name NOPRINT
Например,
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>
Осигурява ли правилна пагинация?
Да, ако напишете правилно заявката за пагинация.
Например,
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>
Или използвайте новата функция за ограничаване на редове на 12c, както показах по-горе.
Тук има няколко добри примера.