Hai 4 domande e tutte ruotano attorno all'utilizzo e alla funzionalità di ROWNUM . Risponderò a ogni domanda una per una.
Perché (questo è stato il mio primo tentativo fino a quando non ho cercato su SO) Select * From Person Where rownum> 100 and rownum <110; restituisce 0 righe?
Bella spiegazione di Thomas Kyte per quanto riguarda ROWNUM e l'impaginazione qui.
Un ROWNUM il valore viene assegnato a una riga dopo che ha superato la fase del predicato della query ma prima che la query esegua qualsiasi ordinamento o aggregazione. Inoltre, un valore ROWNUM viene incrementato solo dopo che è stato assegnato, motivo per cui la seguente query non restituirà mai una riga:
select *
from t
where ROWNUM > 1;
Poiché ROWNUM> 1 non è vero per la prima riga, ROWNUM non avanza a 2. Pertanto, nessun valore ROWNUM diventa mai maggiore di 1.
Perché non esiste un modo semplice per fare qualcosa come Seleziona ... DA ... DOVE rownum TRA lowerBound E upperBound ?
Si C'è. Da Oracle 12c in poi, puoi utilizzare la nuova limitazione delle prime n righe caratteristica. Vedi la mia risposta qui.
Ad esempio, la query seguente restituirebbe i dipendenti tra il 4° più alto fino al 7° stipendio più alto in ordine crescente:
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>
Come sbarazzarsi della colonna r nei valori risultanti?
Invece di select *
, elenca i nomi di colonna richiesti nella query esterna. Per l'utilizzo frequente della query, la creazione di una vista è una semplice attività una tantum.
In alternativa, in SQL*Plus
potresti usare il NOPRINT comando. Non visualizzerà il nome della colonna che non si desidera visualizzare. Tuttavia, funzionerebbe solo in SQL*Plus.
Ad esempio,
COLUMN column_name NOPRINT
Ad esempio,
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>
Garantisce una corretta impaginazione?
Sì, se scrivi correttamente la query di impaginazione.
Ad esempio,
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>
Oppure, usa la nuova funzione di limitazione delle righe su 12c come ho mostrato sopra.
Alcuni buoni esempi qui.