Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2922 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL Server : récupérer les enregistrements n à m, problème

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

SQL Server : récupérer les enregistrements n à m, problème

n°352381
El_gringo
Posté le 04-04-2003 à 10:22:20  profilanswer
 

Alors voila, je fais un moteur de recherche (très particulier, ms bon, là n'est pas la question). Celui-ci est compatible avec tous les SGBD "courants", j'assure donc la compatbilité (pour l'instant), avec Oracle, SQL Server, et MySQL.
Ce moteur de recherche génère (en Java) des requètes SQL.
Je fais des requètes sur de très grosses bases.
J'offre donc une fonctionnalité : découpage des résultats d'une recherche en plusieurs blocs. Par exemple, quand on lance une recherche sur certains critères, je récupère les enregistrements 0 à 101 correspondant à cette requète. Puis je signale à l'utilisateur que d'autres résultats existent, et propose de récupérer les 100 enregsitrements suivants, etc...
Si le nb max d'enregsitrements est fixé à 100, je fais ma requète sur 101. Comme ça si 101 enregistrement sont trouvés, 100 sont affichés, et je sais qu'il existe + d'enregistrements en base de données que le nombre d'enregistrements affichés (au moins 1 en +).
Et c'est là qu'un problème se pose, sous SQL Server.
Voici (ss SQL Server) le schéma de requète que j'utilise :


select * from (
    select top <%MAX_RECH%> * from (
        select top <%OFFSET + MAX_RECH%> * from test order by idtest
    ) as t1 order by idtest DESC
) as t2 order by idtest

 
 
MAX_RECH est remplacé par le nombre maxi d'enregistrement constituant chaque bloc.
OFFSET est le point de départ du bloc à récupérer (si MAX_RECH est à 100, et que l'utilisateur veut visualiser les enregistrements de 300 à 400, offset vaut 300).
Pour l'expliquation sur la stratégie de la requète, voir ici :
http://www.devparadise.com/technoweb/code/sql/A453.asp
Le problème cette requète, c'est que, si j'ai 20 enregistrements, et que je tente de récupérer les enregistrements 15 à 25, au lieu de me rendre uniquement les 5 derniers enregistrement, SQLServer me rendra les 10 derniers enregistrement, à savoir, les enregistrements 10 à 20. ça ne m'arrange pas du tout. Si qqn vois une manière possible de corriger mon schéma de requète de manière à ce que, dans ces circonstances, je récupère uniquement les 5 derniers enregistrements, je suis preneur.
Voila, merci à ceux qui ont eu le courage de ma lire jusqu'au bout, encore + si c'est pour m'aider. :D
 

mood
Publicité
Posté le 04-04-2003 à 10:22:20  profilanswer
 

n°352558
El_gringo
Posté le 04-04-2003 à 12:20:08  profilanswer
 

...Haaaa, c'est pas simple, hein !?

n°352773
MagicBuzz
Posté le 04-04-2003 à 14:14:25  profilanswer
 

Attends, j'ai le code quelquepart...

n°352777
MagicBuzz
Posté le 04-04-2003 à 14:16:11  profilanswer
 
n°352792
El_gringo
Posté le 04-04-2003 à 14:25:46  profilanswer
 

Merci, mais c'est en gros le même requète que celle que j'utilise déja, et elle pose le même problème, à savoir :


Le problème cette requète, c'est que, si j'ai 20 enregistrements, et que je tente de récupérer les enregistrements 15 à 25, au lieu de me rendre uniquement les 5 derniers enregistrement, SQLServer me rendra les 10 derniers enregistrement, à savoir, les enregistrements 10 à 20. ça ne m'arrange pas du tout. Si qqn vois une manière possible de corriger mon schéma de requète de manière à ce que, dans ces circonstances, je récupère uniquement les 5 derniers enregistrements, je suis preneur.

n°353065
MagicBuzz
Posté le 04-04-2003 à 16:24:45  profilanswer
 

oups, désolé, j'avais eu la flème de lire ton post :/
 
pour ton problème, je ne vois pas.
 
le mieu serait de faire la métode classique genre :
 

Code :
  1. rs.open sql
  2. if rs.count > lStart then
  3.    rs.move(lStart)
  4.    for (i = lStart to min(lEnd, rs.count))
  5.       response.write rs(1) & "<br>"
  6.       rs.movenext
  7.    next
  8. end if


 
Mais ça ne marche pas avec tous les SGBD, car ce sont des extentions des fonctionnalités basiques de MDAC.
 
PS: Y'a pas de min(x, y) en ASP, je te laisse la programmer ;)
 
PS²: Ma méthode, mise à part sa portabilité qui est mauvaise, n'est pas trop mauvaise en perfs, car tu peux indiquer que le rs tourne côté serveur BDD au lieu d'être rappatrié en entier sur le serveur IIS avant le traîtement. Donc tu ne transfert de la base au site que les lignes que tu lis.


Message édité par MagicBuzz le 04-04-2003 à 16:26:20
n°353101
El_gringo
Posté le 04-04-2003 à 16:47:24  profilanswer
 

MagicBuzz a écrit :

oups, désolé, j'avais eu la flème de lire ton post :/
 
pour ton problème, je ne vois pas.
 
le mieu serait de faire la métode classique genre :
 

Code :
  1. rs.open sql
  2. if rs.count > lStart then
  3.    rs.move(lStart)
  4.    for (i = lStart to min(lEnd, rs.count))
  5.       response.write rs(1) & "<br>"
  6.       rs.movenext
  7.    next
  8. end if


 
Mais ça ne marche pas avec tous les SGBD, car ce sont des extentions des fonctionnalités basiques de MDAC.
 
PS: Y'a pas de min(x, y) en ASP, je te laisse la programmer ;)
 
PS²: Ma méthode, mise à part sa portabilité qui est mauvaise, n'est pas trop mauvaise en perfs, car tu peux indiquer que le rs tourne côté serveur BDD au lieu d'être rappatrié en entier sur le serveur IIS avant le traîtement. Donc tu ne transfert de la base au site que les lignes que tu lis.


 
Oula, mais c'est de l'asp ce que tu me donnes là !? Je touche pas à ça moi, je suis en Java : JSP/Servlet.
Et cette méthode, je l'utilise déja, mon truc est justement nue optimisation : les SGBD gèrent carrément plus vite qu'en énumérant un ResultSet. Merci quand même. :hello:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL Server : récupérer les enregistrements n à m, problème

 

Sujets relatifs
Problème en programant un Batch, aidez-moi svp...[ DOS ] Recuperer le repertoire courant
Problème comportement chkbox perso / checkbox d'origine[script ksh] probleme variable dans awk
problème de chargement[JAVA] Problème de conception
Probleme avec la fonction scrollTo[C] Problème graphique en C
Gros probleme avec un tableau[Resolu (Merci MagicBuzz)] Problème pour lire un flux de byte en C#
Plus de sujets relatifs à : SQL Server : récupérer les enregistrements n à m, problème


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR