¿Cómo puedo devolver un rango específico de ROWNUM valores?

Estoy intentando lo siguiente:

select * from maps006 where rownum >49 and rownum <101

Este devuelve sólo las filas que coincidan con el < operador.

7 Comentarios

  1. 59
     SELECT * from
     (
     select m.*, rownum r
     from maps006 m
     )
     where r > 49 and r < 101
    • Sólo en aras de la exhaustividad, hay una manera de quitar la r de la columna después?
    • Mi solución rápida es cambiar la primera línea a: SELECT col1,col2,col3 from donde col1, col2, etc serían los nombres de todas las columnas excepto r
    • esto no funciona en oracle si no le dan ROWNUM un alias
    • Cómo para seleccionar todas las filas sin rownum en el resultado del conjunto?
    • Puedo obtener resultados inconsistentes en Oracle con este patrón. La doble consulta anidada a continuación se soluciona el problema.
    • Oracle evalúa ROWNUM para el «>» y «<» las comparaciones, tal como un Sindicato, lo que parece. Así que no recomendaría el uso de la cláusula where de esta manera con rownum.
    • Eliminar * en el exterior de seleccionar y hacer que la columna seleccionar como usted requirió. (El uso de la consulta en la aceptan)

  2. 29
    SELECT  *
    FROM    (
            SELECT  q.*, rownum rn
            FROM    (
                    SELECT  *
                    FROM    maps006
                    ORDER BY
                            id
                    ) q
            )
    WHERE   rn BETWEEN 50 AND 100

    Nota la doble vista anidada. ROWNUM es evaluado antes de ORDER BY, por lo que es necesario para la correcta numeración.

    Si se omite ORDER BY cláusula, usted no conseguirá orden coherente.

    • punto de notar! Yo estaba haciendo ese error con orden!
    • Me sale «ORA-00904: «RN»: identificador no válido» cuando yo intente algo similar.
    • por favor hacer otra pregunta y publicar el «algo similar» allí.
    • Todavía no estoy recibiendo por qué el doble de anidación es necesario. Estoy tratando con algunos datos y me está dando coherente de registros.select * from (SELECT tab.*, rownum r FROM table1 tab order by cft.confrm_fraud_id) tab1 WHERE tab1.r BETWEEN 10 AND 20
    • eso es porque tu consulta lee los registros en el orden de confrm_fraud_id, más probablemente con el uso de un índice en ella. Usted no puede confiar en este comportamiento. Comparar estas dos consultas: sqlfiddle.com/#!4/4730c5/5 (incorrecto) y sqlfiddle.com/#!4/4730c5/7 (correcto). Tenga en cuenta que en la consulta incorrecta la ROWNUM incluso en el orden equivocado.
    • Esta solución funcionó a la perfección para mí. Yo estaba tratando de usar ROWNUM BETWEEN 11 AND 20 para la paginación en un conjunto de resultados con 12 filas, pero fue llegar 0 los registros de cualquier rango que comenzó >1. Gracias por la sugerencia!
    • Hola a Todos , ¿por qué no usar combinaciones en lugar de suqueries ? Se debe ser más eficiente…
    • utilizamos dos tipos de combinaciones y de las subconsultas, esto es aún más eficiente.

  3. 12

    Sé que esta es una vieja cuestión, sin embargo, es útil mencionar el nuevas características en el última versión.

    De Oracle 12c en adelante, usted podría utilizar el nuevo Superior-n de la Fila función de limitación. No hay necesidad de escribir una subconsulta, no existe dependencia en ROWNUM.

    Por ejemplo, la siguiente consulta devuelve los empleados entre el 4º más alto hasta el 7 de salarios más elevados, 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>
  4. 6

    Yo estaba buscando una solución para esto y encontré este gran
    artículo que explica la solución
    Extracto relevante

    Todo mi tiempo favorito de uso de ROWNUM es la paginación. En este caso, yo uso
    ROWNUM para obtener las filas de la N a M de un conjunto de resultados. La forma general es como
    de la siguiente manera:

    select * enter code here
      from ( select /*+ FIRST_ROWS(n) */ 
      a.*, ROWNUM rnum 
          from ( your_query_goes_here, 
          with order by ) a 
          where ROWNUM <= 
          :MAX_ROW_TO_FETCH ) 
    where rnum  >= :MIN_ROW_TO_FETCH;

    Ahora con un ejemplo real (en la que se las filas 148, 149 y 150):

    select *
        from
      (select a.*, rownum rnum
         from
      (select id, data
         from t
       order by id, rowid) a
       where rownum <= 150
      )
       where rnum >= 148;
    • Esto realmente funciona!
  5. 2
    SELECT * FROM
    (SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
    WHERE RowNum BETWEEN 49 AND 101
  6. 2

    Usted también puede hacer uso de CTE con cláusula.

    WITH maps AS (Select ROW_NUMBER() OVER (ORDER BY Id) AS rownum,* 
    from maps006 )
    
    SELECT rownum, * FROM maps  WHERE rownum >49 and rownum <101  

Dejar respuesta

Please enter your comment!
Please enter your name here