Si encuentras algo que no comprendes nos puedes dejar un comentario y trataremos de ayudarte rápidamente.
Solución:
Para explicar este comportamiento, necesitamos entender cómo Oracle procesa ROWNUM. Al asignar ROWNUM a una fila, Oracle comienza en 1 y solo incrementa el valor cuando se selecciona una fila; es decir, cuando se cumplen todas las condiciones de la cláusula WHERE. Dado que nuestra condición requiere que ROWNUM sea mayor que 2, no se seleccionan filas y ROWNUM nunca se incrementa más allá de 1.
La conclusión es que condiciones como las siguientes funcionarán como se esperaba.
.. DONDE número de filas = 1;
.. DONDE número de filas <= 10;
Mientras que las consultas con estas condiciones siempre devolverán cero filas.
.. DONDE número de filas = 2;
.. DONDE número de filas > 10;
Citado de Comprender Oracle rownum
Debe modificar su consulta de esta manera para que funcione:
select empno
from
(
select empno, rownum as rn
from (
select empno
from emp
order by sal desc
)
)
where rn=2;
EDITAR: he corregido la consulta para obtener el número de fila después el pedido por sal desc
En el primera consulta, la primera fila tendrá ROWNUM = 1, por lo que será rechazada. La segunda fila también tendrá ROWNUM = 1 (porque la fila anterior fue rechazada) y también será rechazada, la tercera fila también tendrá ROWNUM = 1 (porque todas las filas anteriores fueron rechazadas) y también será rechazada, etc. El resultado es que se rechazan todas las filas.
los segunda consulta no debe devolver el resultado que obtuvo. Debería asignar correctamente ROWNUM después ORDEN POR.
Como consecuencia de todo esto, necesitas usar no 2 sino 3 niveles de subconsultas, así:
SELECT EMPNO, SAL FROM ( -- Make sure row is not rejected before next ROWNUM can be assigned.
SELECT EMPNO, SAL, ROWNUM R FROM ( -- Make sure ROWNUM is assigned after ORDER BY.
SELECT EMPNO, SAL
FROM EMP
ORDER BY SAL DESC
)
)
WHERE R = 2
El resultado:
EMPNO SAL
---------------------- ----------------------
3 7813
prueba esto:
SELECT ROW_NUMBER() OVER (ORDER BY empno) AS RowNum,
empno
FROM tableName
WHERE RowNumber = 2;
Fragmento de la fuente:
SELECT last_name FROM
(SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100
REFERENCIA
Te mostramos las comentarios y valoraciones de los usuarios
Más adelante puedes encontrar las anotaciones de otros gestores de proyectos, tú además eres capaz insertar el tuyo si dominas el tema.