Pergunta

Como fazer paginação no SQL Pervasive (versão 9.1)? Eu preciso fazer algo semelhante como:

//MySQL
SELECT foo FROM table LIMIT 10, 10

Mas eu não consigo encontrar uma maneira de definir offset.

Foi útil?

Solução 4

Acabei fazendo a paginação no código. Eu simplesmente ignorar os primeiros registros em loop.

Eu pensei que eu inventei uma maneira fácil para fazer a paginação, mas parece que Pervasive SQL não permite cláusulas de ordem em subconsultas. Mas isso deve funcionar em outros bancos de dados (eu testei em firebird)

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

Outras dicas

consulta Testado em PSQL:

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

para todos n = No.of registros u precisam buscar de cada vez. e k = múltiplos de n (por exemplo, n = 5;. k = 0,5,10,15, ....)

Nossa paginação necessário que sejamos capazes de passar o número da página e página tamanho atual (juntamente com alguns parâmetros de filtro adicionais) como variáveis. Desde um seleto @page_size topo não funciona no MS SQL, que surgiu com a criação de uma tabela temporária ou variável a atribuir a cada chave primária fileiras uma identidade que mais tarde pode ser filtrada pelo número da página desejada e tamanho.

** Note que se você tiver uma chave primária GUID ou uma chave composta, você só tem que mudar o ID de objeto na tabela temporária para um uniqueidentifier ou adicionar as colunas de chave adicionais para a mesa.

O lado negativo disso é que ele ainda tem para inserir todos os resultados na tabela temporária, mas pelo menos é apenas as teclas. Isso funciona em MS SQL, mas deve ser capaz de obra para qualquer banco de dados com ajustes mínimos.

declarar @page_number int, @page_size int - adicionar qualquer pesquisa adicional parâmetros aqui

- criar a tabela temporária com a coluna de identidade eo id
--de o registro que você estará selecionando. Este é um na memória
--table, por isso, se o número de linhas que você estará inserindo é maior
--than 10.000, então você deve usar uma tabela temporária em tempdb
--em vez de. Para fazer isso, use
#temp_table TABELA --create (identidade núm_linha int (1,1), int objectid)
--e mudar todas as referências a @temp_table para #temp_table
DECLARE TABLE @temp_table (int núm_linha IDENTIDADE (1,1), int objectid)

- inserção na tabela temporária com os ids dos registros
--nós querer voltar. É fundamental para garantir que a ordem por
--reflects a ordem dos registros para retornar para que o núm_linha
--values ??são definidas na ordem correta e estamos selecionando o
registros --correct com base na página
INSERT INTO @temp_table (Objectid)

/ * Exemplo: SELECT que inserções registros na tabela
temporária SELECIONAR personId
DE PESSOA COM (NOLOCK)
junção interna grau COM (NOLOCK) em degree.personid = person.personid
ONDE person.lastname = @last_name
ORDER BY person.lastname asc, person.firsname asc
* /

- obter o número total de linhas que nós combinamos @total_rows DECLARE
int
SET @total_rows = @@ ROWCOUNT
--calculate o número total de páginas com base no número de
--rows que combinava e o tamanho da página passado como um parâmetro
DECLARE @total_pages int
--add o @page_size - 1 ao número total de linhas para
--calculate o número total de páginas. Isso ocorre porque SQL
rounds --alwasy para baixo para a divisão de inteiros
@total_pages set = (@Total_rows + @page_size - 1) / @page_size

- retornar o conjunto de resultados que estamos interessados ??em juntando
--back ao @temp_table e filtrar por núm_linha
/ * Exemplo: Selecionando os dados para retornar. Se o inserção foi feito
corretamente, em seguida, você deve sempre se juntar à mesa que contém
as linhas para retornar para a coluna no objectid @temp_table

pessoa SELECT. *
DE PESSOA COM (NOLOCK) INNER JOIN @temp_table tt
ON person.personid = tt.objectid
* / Tablet --return apenas as linhas na página que estamos interessados ??em
--e ordem pela coluna núm_linha do @temp_table para se certificar de
--nós está selecionando os registros corretos
Onde tt.row_num < (@Page_size * @page_number) + 1 | E tt.row_num> (@page_size * @page_number) - @page_size
ORDER POR tt.row_num

Eu enfrentar este problema em MS Sql também ... Não há limite ou funções RowNumber. O que faço é inserir as chaves para o meu resultado consulta final (ou às vezes toda a lista de campos) em uma tabela temporária com uma coluna de identidade ... então eu excluir da tabela temporária tudo fora do intervalo eu quero ... uso, em seguida, uma junção contra as chaves e da tabela original, para trazer de volta os itens que eu quero. Isso funciona se você tem uma chave única bom - se não o fizer, bem ... isso é um problema de projeto em si

.

alternativa com um desempenho ligeiramente melhor é pular a etapa exclusão e usar apenas os números de linha em sua última aderir. Outra melhoria de desempenho é usar o operador TOP para que, no mínimo, você não tem que agarrar o material após o final do que você quer.

Então ... em pseudo-código ... para pegar itens 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top