Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Bases de Datos General (http://www.forosdelweb.com/f21/)
-   -   rowid y paginación (http://www.forosdelweb.com/f21/rowid-paginacion-123171/)

davids 28/03/2003 10:09

rowid y paginación
 
Hola a todos,

He trabajado en oracle y ahora he pasado a sqlServer y tengo un problema que no sé como solucionar:

En oracle existe la propiedad rowid que es un identificativo numerico que se incrementa de 1 en 1 en cada registro de una consulta.
Es decir, es como una numeración del resultado de un select, de forma que si hago una consulta:

select nombre, apellidos from alumnos order by apellidos asc

el resultado sería:

rowid nombre apellidos
----- ------ ---------
1 pepe alvarez
2 juan garcia
3 antonio marquez
4 david perez
5 pepe sanchez
.
.
.



como veis se 'inventa' un nuevo campo al que llama rowid y lo rellena con un numero que se va incrementando.

Ademas, aunque este campo se genera en la consulta, puede formar parte de ella en la clausula where, por ejemplo:

select nombre, apellidos
from alumnos
where rowid >= 5 and rowdid <=10
order by apellidos asc



Lo que nos da como resultado los registros que van del 5 al 10. Yo usaba esto para la paginación.

Ahora lo que quiero es paginar registro a registro, es decir quiero tener una página asp con todos los
datos de un alumno y tener dos botones: anterior y siguiente. El criterio para saber cual es el
registro anterior o siguiente puede venir dado por el orden de distintos campos, a veces será el apellido, otras veces la calificación...

No se me ocurre como puedo hacer esto sin la propiedad rowid que sqlServer no tiene o al menos no se llama igual.

¿Sabe alguien si sql server tiene algo parecido o si no lo tiene como puedo plantear un select que lo genere?

Saludos y gracias

Yanix 31/03/2003 11:20

Igual al rowid de oracle, no he oido de uno.... y el TOP en este caso no te caeria a menos que..hmmm no.

Hmmm..podrias crear una tabla temporera donde le añadas esa columna con identity de 1, que te incrementará ese número uno a uno.

O igual podrias hacer queries uniendo el syslocksinfo y usar la opcion de ROWLOCK para seleccionar la fila que quieres y usar sp_lock para ver su id (RID)...pero se te puede complicar mas...

:pensando:

Linterns 31/03/2003 13:48

Solo por aclaracion.... el rowid te trae una cadena identificador y no el numero de la tupla... creo que te refieres al rownum.

algo asi:

Código PHP:

 select rownumrowidsol_numero
  from soliitudes



SQL
> /

    
ROWNUM ROWID              SOL_NUMERO
---------- ------------------ ----------
         
1 AAAHuDAAgAAABIKAAA          1
         2 AAAHuDAAgAAABIJAAA          2
         3 AAAHuDAAgAAABIQAAA          3
         4 AAAHuDAAgAAABIGAAA          4
         5 AAAHuDAAgAAABIGAAB          5
         6 AAAHuDAAgAAABIGAAC          6
         7 AAAHuDAAgAAABIQAAB          7
         8 AAAHuDAAgAAABIEAAA          8
         9 AAAHuDAAgAAABIJAAB          9

9 filas seleccionadas



Yanix 31/03/2003 16:35

Buen punto, Linterns ;-)

Ojalá alguna de las alternativas le funcione...(imaginandonos que es el rownum lo que quiere buscar...)

Aun sigo pensando si ha de haber alguna otra forma...
:pensando:

davids 01/04/2003 04:00

Hola a todos y gracias por las respuestas.

En primer lugar Linterns tiene razón, me referia al rownum en vez del rowid.

He estado buscando soluciones al problema de obtener las tuplas desde N a M ordenados previamente por un campo que no es la clave. Me he encontrado varias soluciones (en las que no es necesario el rownum, ni generar algo parecido), la mas clara es la siguiente:

Para obtener desde N hasta M ordenados por Column

SELECT *
FROM (SELECT TOP [M - N + 1] Column
FROM (SELECT TOP M Column
FROM Table
ORDER BY Column) AS Alias
ORDER BY Column DESC) AS Alias
ORDER BY Column

La opcion de crear una tabla temporal también la he contemplado, pero como yo quiero esto para una página web que puede llegar a ser bastante consultada, he pensado que la opción de los select puede necesitar menos recursos que la creación de tablas temporales.

Bueno, ahi dejo la solución que he encontrado por si alguien la necesitan y para que opinen que les parece.

Gracias de nuevo a todos por su ayuda.

Linterns 01/04/2003 09:17

Una solucion bastante aceptable si estas utilizando el cache del servidor es la siguiente:

Creas un Cursor con todos los registros (dependiendo por supuesto del filtro) y para mostrarlos simplemente los insertas en un lazo FOR

Algo asi, si estas en la pagina 5 y estas mostrando de 20 en 20 el for deberia ir algo asi:
Código PHP:

cursor select registro1registro2etc
from mytrabla
where 
= .....


numregmostrar := 20;
paginaactual := 5;

for 
j=(numregmostrar*paginaactual ) .. (numregmostrar*paginaactual ) + numregmostrar loop
   
-- muestro el registro 
    htp
.print(j.registro);
end loop

claro que tienes que pasar como parametro la pagina que estas utilizando y como el select es el mismo para cada pagina ya lo tienenes en cache del server.

OJO: tienes que activar el cache del server para ello si no cada ocasion que realizas el select se generara nuevamente y esto te consumira tiempo y recurso de disco.

davids 01/04/2003 09:41

Ok, si entiendo bien, gracias al uso de la cache el server no realiza un select si ya lo tiene hecho previamente. ¿verdad?

En mi caso tengo unas 30000 tuplas, las cuales se muestran de 10 en 10. La necesidad de buscar una sentencia que me diera las tuplas de la 1 a la 10, de la 11 a la 20... viene de aquí. Pensaba que consumiría menos recursos sacar solo las que voy a necesitar y no las 30000.

Ahora, pensando que el select solo se ejecutará una vez, supongo que la mejor opción es la que me comentas.

Saludos y gracias

initiald 23/07/2011 10:22

Respuesta: rowid y paginación
 
Cita:

Iniciado por davids (Mensaje 353702)
Ok, si entiendo bien, gracias al uso de la cache el server no realiza un select si ya lo tiene hecho previamente. ¿verdad?

En mi caso tengo unas 30000 tuplas, las cuales se muestran de 10 en 10. La necesidad de buscar una sentencia que me diera las tuplas de la 1 a la 10, de la 11 a la 20... viene de aquí. Pensaba que consumiría menos recursos sacar solo las que voy a necesitar y no las 30000.

Ahora, pensando que el select solo se ejecutará una vez, supongo que la mejor opción es la que me comentas.

Saludos y gracias

La solucion mas practica definitivamente es crear una columna RowID y que sea de tipo indentity incrementado de uno a uno, asi podras operar con ella.

gnzsoloyo 23/07/2011 17:27

Respuesta: rowid y paginación
 
Shhhh...! No despiertes a los muertos...

http://static.guim.co.uk/sys-images/...l-Dead-006.jpg

Este post que acabas de resucitar tiene ya más de ocho años. Algunos de sus participantes no han vuelto desde entonces y los demás han superado el problema desde hace mucho tiempo.
El tema, por lo demás, es muy viejo, ten en cuenta que en ocho años han pasado ya varias versiones de SQL Server y de Oracle, por lo que todo el problema es como mínimo, obsoleto.

Trata de fijarte en la fecha de los posts que abres. Cuando los moderadores encuentran estas resurrecciones es muy habitual que cierren el post definitivamente.


La zona horaria es GMT -6. Ahora son las 00:04.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.