2008-09-23 7 views
0

Comment faire pagination dans SQL Pervasive (version 9.1)? Je dois faire quelque chose de similaire, comme:Pagination dans SQL Pervasive

//MySQL 
SELECT foo FROM table LIMIT 10, 10 

Mais je ne trouve pas de moyen de définir le décalage.

Répondre

0

J'ai fini par faire le code de pagination. Je saute les premiers enregistrements en boucle.

Je pensais avoir inventé un moyen facile de faire la pagination, mais il semble que sql omniprésente n'autorise pas les clauses de commande dans les sous-requêtes.Mais cela devrait fonctionner sur d'autres blocs de données (je l'ai testé sur firebird)

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

Je suis confronté à ce problème dans MS Sql aussi ... pas de fonctions Limit ou Rownumber. Qu'est-ce que je fais est d'insérer les clés pour mon résultat final de la requête (ou parfois la liste complète des champs) dans une table temporaire avec une colonne d'identité ... puis je supprime de la table temporaire tout ce que je veux ... une jointure contre les clés et la table d'origine, pour ramener les objets que je veux. Cela fonctionne si vous avez une bonne clé unique - si vous ne le faites pas, eh bien ... c'est un problème de conception en soi.

L'alternative avec des performances légèrement meilleures est d'ignorer l'étape de suppression et d'utiliser simplement les numéros de ligne dans votre jointure finale. Une autre amélioration des performances consiste à utiliser l'opérateur TOP pour qu'à tout le moins, vous n'ayez pas à saisir les données après la fin de ce que vous voulez.

Alors ... en pseudo-code ... pour attraper des objets 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 
1

Notre pagination nécessaire que nous soyons en mesure de passer dans le numéro de page et la taille de la page (le long avec quelques paramètres de filtre supplémentaires) en tant que variables. Étant donné qu'un haut de page @page_size ne fonctionne pas dans MS SQL, nous avons créé une table temporaire ou variable pour attribuer à chaque clé primaire de ligne une identité qui peut ensuite être filtrée pour le numéro de page et la taille désirés.

** Notez que si vous avez une clé primaire GUID ou une clé composée, il vous suffit de modifier l'ID d'objet de la table temporaire en identificateur unique ou d'ajouter les colonnes de clé supplémentaires à la table. L'inconvénient de ceci est qu'il doit encore insérer tous les résultats dans la table temporaire, mais au moins c'est seulement les clés. Cela fonctionne dans MS SQL, mais devrait être capable de fonctionner pour n'importe quelle base de données avec des réglages minimes.

@page_number int déclare, @page_size int - ajouter des paramètres de recherche supplémentaires ici

--create la table temporaire avec la colonne d'identité et l'ID
--en l'enregistrement qui tu vas choisir. Ceci est une mémoire
--table, donc si le nombre de lignes que vous allez insérer est supérieur
- au-delà de 10 000, alors vous devriez utiliser une table temporaire dans tempdb
- à la place. Pour ce faire, utilisez
#temp_table --create TABLE (no_lig int IDENTITÉ (1,1), objectid int)
--et changer toutes les références à @temp_table à #temp_table
DECLARE @temp_table TABLE (no_lig int IDENTITÉ (1,1), objectid int)

--insert dans la table temporaire avec les IDs des dossiers
-Nous veulent revenir.Il est essentiel de s'assurer que la commande par
- reflète l'ordre des enregistrements à retourner de sorte que le row_num
- les valeurs sont définies dans le bon ordre et nous sélectionnons le
- les corrections correctes basées sur la page
INSERT INTO @temp_table (objectid)

/* Exemple: Sélectionnez qui insère des enregistrements dans la table temporaire
SELECT personID
dE AVEC personne (NOLOCK)
rejoindre degré intérieur avec (NOLOCK) sur le degré. personid = personne.persée
OÙ person.lastname = @last_name
ORDER BY person.lastname asc, person.firsname asc
*/

--get le nombre total de lignes que l'on fait correspondre
DECLARE @total_rows int
SET @total_rows = @@ ROWCOUNT
--calculate le nombre total de pages sur la base du nombre de
--rows et qui correspondent à la taille de la page passée en tant que paramètre
DECLARE @total_pages int
--add la @ page_size - 1 au nombre total de lignes à
--calculez le nombre total de pages. En effet, sql
--alwasy arrondit pour la division des entiers
SET @total_pages = (@total_rows + @page_size - 1)/ @page_size

--return le jeu de résultats, nous sommes intéressés à se joindre par
--back to the @temp_table et filtrage par row_num
/* Exemple: Sélection des données à renvoyer. Si l'insert a été fait
correctement, alors vous devriez toujours joindrez la table qui contient les lignes
retourner à la colonne objectid sur la @temp_table

personne SELECT. *
DE personne AVEC (NOLOCK) INNER JOIN @temp_table tt
oN person.personid = tt.objectid
*/
--return seulement les lignes de la page qui nous intéresse
--et commande par la colonne no_lig du @temp_table pour vous assurer
-Nous sont la sélection des enregistrements corrects
OÙ tt.row_num < (@page_size * @page_number) + 1
ET tt.row_num> (* @page_size @page_number) - @page_size
COMMANDE PAR tt.row_num

2

requête Testé PSQL:

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

pour tout n = u numeros enregistrements ont besoin d'aller chercher à la fois. et k = multiples de n (par exemple n = 5; k = 0,5,10,15, ....)