Retroceder   Foros del Web > Programación para sitios web > Bases de Datos

Respuesta
 
Herramientas Desplegado
Antiguo 28-mar-2003, 09:09   #1 (permalink)
davids está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Mensajes: 64
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
davids está desconectado   Responder Citando
Antiguo 31-mar-2003, 10:20   #2 (permalink)
Yanix está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: Norte America
Mensajes: 820
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-mar-2003 a las 10:23.
Yanix está desconectado   Responder Citando
Antiguo 31-mar-2003, 12:48   #3 (permalink)
Colaborador
Linterns tiene algunos puntos positivos de karma
 
Avatar de Linterns
 
Fecha de Ingreso: noviembre-2002
Mensajes: 2.803
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
** ***
Linterns está desconectado   Responder Citando
Antiguo 31-mar-2003, 15:35   #4 (permalink)
Yanix está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: Norte America
Mensajes: 820
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
Yanix está desconectado   Responder Citando
Antiguo 01-abr-2003, 03:00   #5 (permalink)
davids está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Mensajes: 64
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.
davids está desconectado   Responder Citando
Antiguo 01-abr-2003, 08:17   #6 (permalink)
Colaborador
Linterns tiene algunos puntos positivos de karma
 
Avatar de Linterns
 
Fecha de Ingreso: noviembre-2002
Mensajes: 2.803
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
** ***
Linterns está desconectado   Responder Citando
Antiguo 01-abr-2003, 08:41   #7 (permalink)
davids está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Mensajes: 64
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
davids está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 13:46.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93