![]() |
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 |
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: |
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: |
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: |
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. |
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: 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. |
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 |
Respuesta: rowid y paginación Cita:
|
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.