Pregunta

Cómo hacer la paginación en Pervasive SQL (versión 9.1)?Necesito hacer algo similar a:

//MySQL
SELECT foo FROM table LIMIT 10, 10

Pero no puedo encontrar una manera de definir el offset.

¿Fue útil?

Solución 4

Lo que terminó haciendo la paginación en el código.Me acaba de saltar los primeros registros en el bucle.

Pensé que me inventé una manera fácil para hacer la paginación, pero parece que pervasive sql no permite el orden de las cláusulas en las subconsultas.Pero esto debería funcionar en otros DBs (lo he comprobado en firebird)

select *
from (select top [rows] * from
(select top [rows * pagenumber] * from mytable order by id)
order by id desc)
order by id

Otros consejos

Probado consulta en PSQL:

select top n * 
from tablename 
where id not in(
select top k id
from tablename 
) 

para todo n = no.de los registros u necesidad de buscar a un tiempo.y k = múltiplos de n(por ejemplo.n=5;k=0,5,10,15,....)

Nuestra paginación requiere que seamos capaces de pasar en el número de página actual y el tamaño de página (junto con algunos otros parámetros de filtro) como variables.Desde un select top @page_size no funciona en MS SQL, que surgió con la creación de un temporal o tabla de variables para asignar cada una de las filas de la clave principal de una identidad que más tarde pueden ser filtrados para el número de página deseado y el tamaño.

** Tenga en cuenta que si usted tiene un GUID clave primaria o una clave compuesta, usted sólo tiene que cambiar el id de objeto de la tabla temporal a un uniqueidentifier o agregar la clave adicional columnas a la tabla.

El lado negativo de esto es que todavía tiene que insertar todos los resultados en la tabla temporal, pero al menos es sólo las llaves.Esto funciona en MS SQL, pero debe ser capaz de trabajar en cualquier base de datos con un mínimo de ajustes.

declare @page_number int, @page_size int -- agregar cualquier búsqueda adicionales aquí los parámetros de

--crear la tabla temporal con la columna de identidad y la identificación de
--de que el registro que va a ser la selección.Se trata de una memoria
--tabla, por lo que si el número de filas que va a ser la inserción es mayor
--de 10.000, entonces usted debe utilizar una tabla temporal en tempdb
--en su lugar.Para ello, utilice
--CREAR la TABLA #temp_table (núm_fila int IDENTITY(1,1), int idobjeto)
--y cambiar todas las referencias a @temp_table a #temp_table
DECLARE @temp_table TABLA (fila int IDENTITY(1,1), int idobjeto)

--insertar en la tabla temporal con los identificadores de los registros
--queremos volver.Es fundamental asegurarse de que la orden por
--refleja el orden de los registros para devolver de manera que el núm_fila
--se establecen los valores en el orden correcto y estamos seleccionando
--corregir los registros basados en la página
INSERT INTO @temp_table (objectid)

/* Ejemplo:Seleccione el que se inserta los registros en la tabla temporal
SELECCIONE personid
DE persona CON (NOLOCK)
inner join grado CON (NOLOCK) en el grado.personid = persona.personid
DONDE persona.lastname = @apellido
ORDEN POR persona.apellido asc, persona.firsname asc
*/

--obtener el número total de filas que nos corresponde
DECLARE @total_rows int
SET @total_rows = @@ROWCOUNT
--calcular el número total de páginas que se basan en el número de
--filas que coinciden y el tamaño de la página pasa como parámetro
DECLARAR @total_pages int
--agregar el @page_size - 1 para el número total de filas
--calcular el número total de páginas.Esto es debido a que sql
--siempre redondea hacia abajo para la división de números enteros
SET @total_pages = (@total_rows + @page_size - 1) / @page_size

--devolver el conjunto de resultados que estamos interesados en unirse
--de nuevo a la @temp_table y el filtrado por núm_fila
/* Ejemplo:La selección de los datos para volver.Si el insertar fue hecho
adecuadamente, entonces usted siempre debe formar parte de la mesa que contiene
las filas para volver para el objectid de la columna en la @temp_table

SELECCIONAR la persona.*
DE persona CON (NOLOCK) INNER JOIN @temp_table tt
EN la persona.personid = tt.objectid
*/
--devolver sólo las filas en la página que nos interesa
--y el orden de la fila de la columna de @temp_table para asegurarse de que
--estamos seleccionando los registros correctos
DONDE tt.núm_fila < (@page_size * @page_number) + 1
Y tt.núm_fila > (@page_size * @page_number) - @page_size
El FIN de POR el tt.núm_fila

Me enfrento a este problema en MS Sql demasiado...no hay Límite o rownumber funciones.Lo que quiero hacer es insertar las llaves de mi final de resultados de la consulta (o, a veces, toda la lista de campos) en una tabla temporal con una columna de identidad...a continuación, voy a borrar de la tabla temporal todo fuera de la gama quiero...a continuación, utilice una combinación contra de las teclas y la tabla original, para traer de vuelta los artículos que desee.Esto funciona si tienes una buena clave única - si no, bueno...eso es un problema de diseño en sí mismo.

Alternativa con un rendimiento un poco mejor es omitir la eliminación de paso y sólo tiene que utilizar los números de fila en la final de la combinación.Otra mejora en el rendimiento es el uso de la parte SUPERIOR del operador, de modo que, al menos, no tienes que agarrar las cosas más allá del final de lo que usted desea.

Así que...en pseudo-código de la...para agarrar objetos 80-89...

create table #keys (rownum int identity(1,1), key varchar(10))

insert #keys (key)
select TOP 89 key from myTable ORDER BY whatever

delete #keys where rownumber < 80

select <columns> from #keys join myTable on #keys.key = myTable.key
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top