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

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

Marsh Posté le 04-04-2003 à 10:22:20    

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
 

Reply

Marsh Posté le 04-04-2003 à 10:22:20   

Reply

Marsh Posté le 04-04-2003 à 12:20:08    

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

Reply

Marsh Posté le 04-04-2003 à 14:14:25    

Attends, j'ai le code quelquepart...

Reply

Marsh Posté le 04-04-2003 à 14:16:11    

Reply

Marsh Posté le 04-04-2003 à 14:25:46    

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.

Reply

Marsh Posté le 04-04-2003 à 16:24:45    

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
Reply

Marsh Posté le 04-04-2003 à 16:47:24    

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:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed