Estoy usando Oracle 10g y el siguiente paradigma para obtener una página de 15 resultados por vez (de modo que cuando el usuario mira la página 2 de un resultado de búsqueda, vean los registros 16-30).(Oracle) ¿Cómo obtener el número total de resultados al usar una consulta de paginación?
select *
from
(select rownum rnum, a.*
from (my_query) a
where rownum <= 30)
where rnum > 15;
En este momento estoy tener que ejecutar una instrucción SQL por separado a un "select count" en "my_query" con el fin de obtener el número total de resultados de my_query (para que pueda mostrar a la usuario y utilícelo para calcular el número total de páginas, etc.).
¿Hay alguna forma de obtener el número total de resultados sin hacer esto mediante una segunda consulta, es decir, obteniéndolo de la consulta anterior? He intentado agregar "max (rownum)", pero parece que no funciona (aparece un error [ORA-01747] que parece indicar que no me gusta tener la palabra clave rownum en el grupo).
Mi razonamiento para querer obtener esto de la consulta original en lugar de hacerlo en una declaración SQL separada es que "my_query" es una consulta cara, así que prefiero no ejecutarla dos veces (una para obtener el conteo y una vez para obtener la página de datos) si no tengo que hacerlo; pero cualquier solución que se me ocurra para obtener el número de resultados de una sola consulta (y al mismo tiempo obtener la página de datos que necesito) no debería agregar mucho, si es posible, una sobrecarga adicional. Por favor avise.
Esto es exactamente lo que estoy tratando de hacer para lo cual recibo un error ORA-01747 porque creo que no me gusta que tenga ROWNUM en el grupo. Nota, si hay otra solución que no usa max (ROWNUM), sino otra cosa, también está perfectamente bien. Esta solución fue mi primer pensamiento en cuanto a lo que podría funcionar.
SELECT * FROM (SELECT r.*, ROWNUM RNUM, max(ROWNUM)
FROM (SELECT t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t0.LAST_NAME, t1.SCORE
FROM ABC t0, XYZ t1
WHERE (t0.XYZ_ID = 751) AND
t0.XYZ_ID = t1.XYZ_ID
ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30 GROUP BY r.*, ROWNUM) WHERE RNUM > 15
--------- -------- EDITAR Nota, basado en el primer comentario He intentado lo siguiente que aparece a trabajar. Sin embargo, no sé qué tan bien funciona frente a otras soluciones (estoy buscando la solución que satisfaga mis necesidades pero que rinda mejor). Por ejemplo, cuando ejecuto esto, toma 16 segundos. Cuando llevo a cabo el COUNT (*) OVER() RESULT_COUNT se tarda sólo 7 segundos:
SELECT * FROM (SELECT r.*, ROWNUM RNUM,)
FROM (SELECT COUNT(*) OVER() RESULT_COUNT,
t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t1.SCORE
FROM ABC t0, XYZ t1
WHERE (t0.XYZ_ID = 751) AND t0.XYZ_ID = t1.XYZ_ID
ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30) WHERE RNUM > 1
La explicar los cambios de planes de hacer una especie (ORDER BY TECLA STOP) para hacer una ventana (SORT).
Antes:
SELECT STATEMENT()
COUNT (STOPKEY)
VIEW()
SORT (ORDER BY STOPKEY)
NESTED LOOPS()
TABLE ACCESS (BY INDEX ROWID) XYZ
INDEX (UNIQUE SCAN) XYZ_ID
TABLE ACCESS (FULL) ABC
Después:
SELECT STATEMENT()
COUNT (STOPKEY)
VIEW()
WINDOW (SORT)
NESTED LOOPS()
TABLE ACCESS (BY INDEX ROWID) XYZ
INDEX (UNIQUE SCAN) XYZ_ID
TABLE ACCESS (FULL) ABC
El otro día, vi a alguien usar 'select a. *, Count (*) over() from a ...' para obtener el recuento total en cada fila.Buen truco, pero no sé exactamente cómo aplicarlo aquí :( – FrustratedWithFormsDesigner
No estoy seguro de cómo funciona esta consulta, pero si es algo relativamente estático, podrías obtener el conteo una vez y guardarlo en una variable de aplicación, y luego solo volver a contar cuando cambia la consulta. No sé si hay una forma de obtener el conteo de un conjunto de resultados sin contar realmente todos los registros. – FrustratedWithFormsDesigner
¿Qué haces cuando tienes múltiples sugerencias que funcionarían igual que Bueno, ¿a cuál se supone que debes marcar en el desbordamiento de la pila como la respuesta? – BestPractices