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í.