sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo funciona ROWNUM en la consulta de paginación?

Tiene 4 preguntas y todas giran en torno al uso y la funcionalidad de ROWNUM . Contestaré cada pregunta una por una.

Por qué (este fue mi primer intento hasta que busqué en SO) Seleccionar * De persona Donde número de fila> 100 y número de fila <110; devuelve 0 filas?

Buena explicación de Thomas Kyte sobre ROWNUM y la paginación aquí.

UN ROWNUM el valor se asigna a una fila después de que pasa la fase de predicado de la consulta pero antes de que la consulta ordene o agregue. Además, un valor ROWNUM se incrementa solo después de que se asigna, por lo que la siguiente consulta nunca devolverá una fila:

select * 
  from t 
 where ROWNUM > 1;

Debido a que ROWNUM> 1 no es verdadero para la primera fila, ROWNUM no avanza a 2. Por lo tanto, ningún valor de ROWNUM nunca llega a ser mayor que 1.

¿Por qué no hay una forma sencilla de hacer algo como Seleccionar... DESDE... DONDE número de fila ENTRE límite inferior Y límite superior?

Sí hay. Desde Oracle 12c en adelante, puede usar la nueva limitación Top-n Row rasgo. Mira mi respuesta aquí.

Por ejemplo, la siguiente consulta devolvería los empleados entre 4to más alto hasta el séptimo salario más alto en orden ascendente:

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>

¿Cómo deshacerse de la columna r en los valores resultantes?

En lugar de select * , enumere los nombres de columna requeridos en la consulta externa. Para usar la consulta con frecuencia, crear una vista es una actividad simple de una sola vez.

Alternativamente, en SQL*Plus podrías usar NOPRINT dominio. No mostrará el nombre de la columna que no desea mostrar. Sin embargo, solo funcionaría en SQL*Plus.

Por ejemplo,

COLUMN column_name NOPRINT

Por ejemplo,

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>

¿Asegura una paginación correcta?

Sí, si escribe correctamente la consulta de paginación.

Por ejemplo,

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>

O bien, use la nueva función de limitación de filas en 12c como se muestra arriba.

Algunos buenos ejemplos aquí.