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

Paginacion, problemas

Estas en el tema de Paginacion, problemas en el foro de SQL Server en Foros del Web. buenas gentes, estoy intentando mostrar los resultados de una consulta en paginas... investigando y buscando por todos lados, me di cuenta que siempre llego a ...
  #1 (permalink)  
Antiguo 01/11/2006, 10:41
 
Fecha de Ingreso: noviembre-2006
Mensajes: 1
Antigüedad: 17 años, 6 meses
Puntos: 0
Paginacion, problemas

buenas gentes, estoy intentando mostrar los resultados de una consulta en paginas...
investigando y buscando por todos lados, me di cuenta que siempre llego a lo mismo.. el codigo encontrado no funciona o no hace lo esperado..
despues de pensar un rato arme una consulta que en teoria pagina, pero tengo problemas cuando quiero ordenar por un campo string (anda medio mal)... la idea es tener tres selects anidados, pero para entenderlos, es mejor ir de adentro hacia afuera... (trabajo en visual basic y sql server)

Código:
SELECT * FROM (
            SELECT TOP 10 * FROM ( 
                SELECT top 10 apellido,nombre,nrodoc FROM afiliados where apellido like 'PON%' order by apellido asc) as x1 
            ORDER by apellido DESC) as x2 
ORDER by apellido ASC
la idea es pasar valores a los select top el de la primer consulta es resultado de multiplicar 10 (la cantidad de registros por pagina) X el numero de pagina
[para la pagina 2 el valor del select central seria 20]

voy a dar por sentado que ya tenemos los primeros 10 registros y ahroa queremos los segundos 10

Código:
SELECT top 20 apellido,nombre,nrodoc FROM afiliados where apellido like 'PON%' order by apellido asc) as x1  
para la primer consulta, el select top 20 interno busca los primeros 20 registros que correspondan con la clausula where ordenados por apellido en forma ascendente...

Código:
SELECT TOP 10 * FROM ( 
                SELECT top 20 apellido,nombre,nrodoc FROM afiliados where apellido like 'PON%'  order by apellido asc) as x1 
ORDER by apellido DESC) as x2  
esta segunda parte de nuestra consulta selecciona en forma descendente los 20 registros de la primer consulta y toma los primeros 10 (al estar en orden descendente.. serian los ultimos 10, los de la segunda pagina, es decir.. los que nos interesan.

Código:
SELECT * FROM (
            SELECT TOP 10 * FROM ( 
                SELECT top 20 apellido,nombre,nrodoc FROM afiliados where apellido like 'PON%' order by apellido asc) as x1 
            ORDER by apellido DESC) as x2 
ORDER by apellido ASC 
esta tercer parte agarra los 10 registros seleccionados en la consulta anterior y los ordena en orden ascendente (recordemos que estos ultimos 10 son los que nos interesan, pero estaban ordenados al revez), por tanto, los vuelvo a ordenar y son los que finalmente muestro...

todo parece funcionar de maravilla no?.. pero no...
si yo hago el select, pero en lugar de ordenar por un string, los ordeno por nrodoc (valor numerico), la consulta funciona bien, pero al hacerla por apellido repite valores y no logro entender por que..
Si alguien con la cabeza un poco menos quemada que yo me ayuda.. voy a estar eternamente agradecido...

Última edición por aquosoft; 01/11/2006 a las 10:48
  #2 (permalink)  
Antiguo 04/11/2006, 08:42
 
Fecha de Ingreso: octubre-2006
Mensajes: 36
Antigüedad: 17 años, 6 meses
Puntos: 0
Se me ocurre que podrías hacer algo diferente utilizando tablas temporales (o variables de tipo tabla concretamente).

DECLARE @tPaginacion TABLE(IdAuto int IDENTITY,
Nombre varchar(200),
Apellido varchar(200),
nroDoc int)

INSERT INTO @tPaginacion(Nombre, Apellido, nroDoc)
SELECT TOP 30 Nombre, Apellido, nroDoc
FROM Afiliados
ORDER BY Apellido

Con lo que en la tabla @tPaginacion tendrás los registros ordenados por apellido y con su nº de registro en el campo IdAuto. Asi que mostrando los que IdAuto > 20 tendrás los del 21 al 30. P Ej.

select *
from @tPaginacion
where IdAuto > 20

El problema de este tipo de tablas es que no aceptan indices, con lo que ira más lento cuanto mayor sea el número de registros.
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 21:19.