Question

Comment faire de la pagination dans Pervasive SQL (version 9.1)? Je dois faire quelque chose de similaire, tel que:

//MySQL
SELECT foo FROM table LIMIT 10, 10

Mais je ne trouve pas de moyen de définir l'offset.

Était-ce utile?

La solution 4

J'ai fini par faire la pagination dans le code. Je passe juste les premiers enregistrements en boucle.

Je pensais avoir trouvé un moyen simple d'effectuer la pagination, mais il semble que SQL envahissant n'autorise pas les clauses d'ordre dans les sous-requêtes. Mais cela devrait fonctionner sur d’autres DB (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

Autres conseils

Requête testée en PSQL:

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

pour tous les enregistrements n = no.of, vous devez extraire à la fois. et k = multiples de n (par exemple, n = 5; k = 0,5,10,15, ....)

Notre pagination nécessitait que nous puissions passer le numéro de page actuel et la taille de la page (avec quelques paramètres de filtre supplémentaires) en tant que variables. Puisqu'une sélection top @page_size ne fonctionne pas dans MS SQL, nous avons créé une table temporaire ou variable pour attribuer à chaque clé primaire de lignes une identité pouvant être filtrée ultérieurement pour le numéro et la taille de page désirés.

** Notez que si vous avez une clé primaire GUID ou une clé composée, il vous suffit de changer l'ID d'objet de la table temporaire en un identifiant unique ou d'ajouter les colonnes de clé supplémentaires à la table.

L’inconvénient, c’est qu’il doit encore insérer tous les résultats dans la table temporaire, mais au moins ce ne sont que les clés. Cela fonctionne sous MS SQL, mais devrait pouvoir fonctionner pour n’importe quelle base de données avec un minimum d’ajustements.

  

declare @page_number int, @page_size   int - ajoute une recherche supplémentaire   paramètres ici

     

- crée la table temporaire avec la colonne d'identité et l'id

  --de l'enregistrement que vous allez sélectionner. Ceci est un souvenir
  --table, donc si le nombre de lignes que vous allez insérer est supérieur
  --plus que 10 000, alors vous devriez utiliser une table temporaire dans tempdb
  --au lieu. Pour ce faire, utilisez
  --CREATE TABLE #temp_table (row_num int IDENTITY (1,1), objectid int)

  --et change toutes les références à @temp_table en #temp_table
  DECLARE @temp_table TABLE (row_num int   IDENTITÉ (1,1), objectid int)

     

- insérer dans la table temporaire avec les identifiants des enregistrements
  --nous voulons revenir. Il est essentiel de s'assurer que la commande par
  --réflète l'ordre des enregistrements à renvoyer de sorte que row_num
  --Les valeurs sont placées dans le bon ordre et nous sélectionnons le fichier
  --correcte les enregistrements en fonction de la page
INSERT INTO @temp_table   (objectid)

     

/ * Exemple: Sélectionnez cette insertion   enregistrements dans la table temporaire
  SELECT personid
FROM personne AVEC   (NOLOCK)
degré de jointure intérieure AVEC   (NOLOCK) sur degree.personid =   person.personid
O   person.lastname = @last_name
  ORDER BY person.lastname asc,   person.firsname asc
  * /

     

- Récupère le nombre total de lignes que nous avons trouvées
DECLARE @total_rows   int
SET @total_rows =   @@ ROWCOUNT
  --calculer le nombre total de pages en fonction du nombre de
  --rows qui correspondent et taille de la page transmise en tant que paramètre
DECLARE   @total_pages int
  --add the @page_size - 1 au nombre total de lignes à
  --calculer le nombre total de pages. C'est parce que sql
  --alwasy arrondit la division des nombres entiers
SET @total_pages =   (@total_rows + @page_size - 1) /   @page_size

     

- retourne le jeu de résultats qui nous intéresse en rejoignant
  --retour de la @temp_table et filtrage par row_num
/ * Exemple:   Sélection des données à renvoyer. Si la   insérer a été fait correctement, puis   vous devriez toujours rejoindre la table   qui contient les lignes à renvoyer   à la colonne objectid sur le   @temp_table

     

CHOISIR UNE PERSONNE. *
DE PERSONNE AVEC   (NOLOCK) INNER JOIN @temp_table   tt
ON person.personid =   tt.objectid
  * /
  --retourner uniquement les lignes de la page qui nous intéressent
  --et commandez par la colonne row_num de la @temp_table pour vous assurer que
  --nous sélectionnons les bons enregistrements
WHERE tt.row_num <   (@page_size * @page_number) + 1
  AND tt.row_num & Gt; (@taille de la page *   @page_number) - @page_size
ORDER   BY tt.row_num

Je suis également confronté à ce problème dans MS Sql ... no Limit or rownumber. Ce que je fais est d’insérer les clés pour le résultat final de ma 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 qui se trouve en dehors de la plage souhaitée ... puis je l’utilise une jointure contre les clés et la table d'origine, pour ramener les éléments que je veux. Cela fonctionne si vous avez une belle clé unique - si vous ne l'avez pas, eh bien ... c'est un problème de conception en soi.

Une alternative aux performances légèrement meilleures consiste à ignorer l'étape de suppression et à n'utiliser que les numéros de ligne de votre jointure finale. Une autre amélioration des performances consiste à utiliser l'opérateur TOP afin de ne pas avoir à récupérer le contenu au-delà de ce que vous voulez.

Alors ... en pseudo-code ... pour récupérer les éléments 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top