Saltar al contenido

Seleccionando la segunda fila de una tabla usando rownum

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *