2010-12-29 21 views
24

¿Cómo puedo devolver un rango específico de valores ROWNUM?SQL ROWNUM cómo devolver filas entre un rango específico

Estoy intentando lo siguiente:

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

Esto devuelve sólo las filas que coinciden con el operador <.

+1

Ver [? ** ¿Cómo funciona ROWNUM en una consulta de paginación **] (http://stackoverflow.com/questions/30321483/how-rownum-works-in-pagination-query/30321788#30321788) –

Respuesta

48
SELECT * from 
(
select m.*, rownum r 
from maps006 m 
) 
where r > 49 and r < 101 
+0

Para completar, ¿hay alguna manera de eliminar la columna r después? –

+3

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 –

+2

esto no funciona en Oracle si no lo hace t darle a ROWNUM un alias –

2
SELECT * FROM 
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable 
WHERE RowNum BETWEEN 49 AND 101 
23
SELECT * 
FROM (
     SELECT q.*, rownum rn 
     FROM (
       SELECT * 
       FROM maps006 
       ORDER BY 
         id 
       ) q 
     ) 
WHERE rn BETWEEN 50 AND 100 

Nota del doble vista anidada. ROWNUM se evalúa antes de ORDER BY, por lo que es necesario para la numeración correcta.

Si omite la cláusula ORDER BY, no obtendrá un orden coherente.

+0

punto observado! ¡Estaba cometiendo ese error con el orden! – MozenRath

+0

Obtengo "ORA-00904:" RN ": identificador inválido" cuando intento algo similar. –

+0

@RobinGreen: por favor haga otra pregunta y publique el "algo similar" allí. – Quassnoi

2

También puede hacerlo usando CTE con la 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 
2
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ; 
4

que estaba buscando una solución para esto y encontré este gran article explaining the solution extracto relevante

Mi todos los tiempos-favorito uso de ROWNUM es la paginación. En este caso, uso ROWNUM para obtener las filas N a M de un conjunto de resultados. La forma general es como sigue:

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 (obtiene 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; 
+0

¡Éste realmente funciona! –

10

Sé que esto es una cuestión de edad, sin embargo, es útil mencionar las nuevas características en la última versión.

De Oracle 12c en adelante, se puede usar el nuevo Top-n Fila función limitante. No es necesario escribir una subconsulta, no hay dependencia en ROWNUM.

Por ejemplo, la siguiente consulta devolvería los empleados entre cuarto más alto hasta el 7 de salarios más altos 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> 
Cuestiones relacionadas