Du har fyra frågor och alla kretsar kring användningen och funktionen av ROWNUM . Jag kommer att svara på varje fråga en i taget.
Varför (detta var mitt första försök tills jag sökte på SO) Välj * Från person Där rownum> 100 och rownum <110; returnerar 0 rader ?
Fin förklaring av Thomas Kyte angående ROWNUM och paginering här.
Ett RADNUM värde tilldelas en rad efter att den passerat predikatfasen av frågan men innan frågan utförs någon sortering eller aggregering. Dessutom ökas ett ROWNUM-värde först efter att det har tilldelats, vilket är anledningen till att följande fråga aldrig returnerar en rad:
select *
from t
where ROWNUM > 1;
Eftersom ROWNUM> 1 inte är sant för den första raden, går ROWNUM inte vidare till 2. Därför får inget ROWNUM-värde någonsin vara större än 1.
Varför det inte finns något enkelt sätt att göra något som Välj ... FRÅN ... VAR radnummer MELLAN nedre gräns OCH övre gräns?
Ja, det finns. Från Oracle 12c och framåt kan du använda den nya begränsningen Top-n Row funktion. Se mitt svar här.
Till exempel skulle frågan nedan returnera de anställda mellan 4:e högsta till 7:e högsta lönerna i stigande ordning:
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>
Hur blir man av med kolumnen r i de resulterande värdena?
Istället för select *
, lista de obligatoriska kolumnnamnen i den yttre frågan. För att du ofta använder frågan är att skapa en vy en enkel engångsaktivitet.
Alternativt i SQL*Plus
du kan använda NOPRINT kommando. Det kommer inte att visa kolumnnamnet som du inte vill visa. Det skulle dock bara fungera i SQL*Plus.
Till exempel,
COLUMN column_name NOPRINT
Till exempel,
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>
Säkerställer det korrekt sidnumrering?
Ja, om du skriver sideringsfrågan korrekt.
Till exempel,
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>
Eller använd den nya radbegränsande funktionen på 12c som jag har visat ovan.
Några bra exempel här.