Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

rowid y paginación

Estas en el tema de rowid y paginación en el foro de Bases de Datos General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 28/03/2003, 10:09
 
Fecha de Ingreso: enero-2002
Mensajes: 64
Antigüedad: 22 años, 10 meses
Puntos: 0
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
  #2 (permalink)  
Antiguo 31/03/2003, 11:20
 
Fecha de Ingreso: noviembre-2002
Ubicación: Washington, DC
Mensajes: 822
Antigüedad: 22 años
Puntos: 5
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...

__________________
Yanira

Última edición por Yanix; 31/03/2003 a las 11:23
  #3 (permalink)  
Antiguo 31/03/2003, 13:48
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
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

__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #4 (permalink)  
Antiguo 31/03/2003, 16:35
 
Fecha de Ingreso: noviembre-2002
Ubicación: Washington, DC
Mensajes: 822
Antigüedad: 22 años
Puntos: 5
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...
__________________
Yanira
  #5 (permalink)  
Antiguo 01/04/2003, 04:00
 
Fecha de Ingreso: enero-2002
Mensajes: 64
Antigüedad: 22 años, 10 meses
Puntos: 0
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.
  #6 (permalink)  
Antiguo 01/04/2003, 09:17
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
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.
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #7 (permalink)  
Antiguo 01/04/2003, 09:41
 
Fecha de Ingreso: enero-2002
Mensajes: 64
Antigüedad: 22 años, 10 meses
Puntos: 0
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
  #8 (permalink)  
Antiguo 23/07/2011, 10:22
Avatar de initiald  
Fecha de Ingreso: diciembre-2008
Ubicación: Lima
Mensajes: 14
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: rowid y paginación

Cita:
Iniciado por davids Ver Mensaje
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.
  #9 (permalink)  
Antiguo 23/07/2011, 17:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: rowid y paginación

Shhhh...! No despiertes a los muertos...



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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:26.