Oracle
 sql >> Database >  >> RDS >> Oracle

Come funziona ROWNUM nella query di impaginazione?

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.