[oracle] récuérer les enregistrements n à m résultants d'une requête

récuérer les enregistrements n à m résultants d'une requête [oracle] - SQL/NoSQL - Programmation

Marsh Posté le 02-04-2003 à 09:50:50    

Je n'comprend pas un truc.
j'ai la requête suivante :


Select VAL1, VAL2, VAL3, VAL4, VAL5 from MATABLE where rownum > 0 and rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;


 
Cette requête me rend 21 résultats.
Et si je fais cette requête là (changement : "rownum > 10" ):


Select VAL1, VAL2, VAL3, VAL4, VAL5 from MATABLE where rownum > 10 and rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;


 
--> 0 résultats !!!! qqn voit une expliquation à ça ?
 
EDIT : Et pendant qu'on y est, si quelqu'un sait faire la même chose avec MySQL, et avec SQLServer, je suis prenneur ! :D


Message édité par El_gringo le 02-04-2003 à 10:01:16
Reply

Marsh Posté le 02-04-2003 à 09:50:50   

Reply

Marsh Posté le 02-04-2003 à 10:26:03    

salut salut
 
La seule réponse que je vois est que tous tes rownum sont <=10


Message édité par cmoua le 02-04-2003 à 10:26:58
Reply

Marsh Posté le 02-04-2003 à 10:30:57    

Non, mais "rownum", c'est pas un colone de ma table MATABLE. en Oracle, rownum, c'est un numéro de ligne résultante. C'est censé permettre de récupérer les résultats 10 à 21 (par exemple) correspondant à une requète.

Reply

Marsh Posté le 02-04-2003 à 10:51:32    

oki oki
 
Si tu passe ta requete en disant seulement rownum>10 et enleve le rownum<=21.
 
ca fait koi


Message édité par cmoua le 02-04-2003 à 10:52:04
Reply

Marsh Posté le 02-04-2003 à 10:55:15    

aucun résultat non plus. Apparement, c'est le rownum > à qqch qui dérange.
Je suis en train de trouver un truc (qui va pas me simplifier la vie, mais bon...).
Apparement, on ne peut pas faire ce que je voulais aussi simplement, mais plutôt comme ça :


Select VAL1, VAL2, VAL3, VAL4, VAL5 from (Select VAL1, VAL2, VAL3, VAL4, VAL5, rownum RN from MATABLE where rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC) where RN between 10 and 20;


 
Comme ça, c'est vrai que ça marche, mais j'trouve ça bizard quand même...


Message édité par El_gringo le 02-04-2003 à 11:00:42
Reply

Marsh Posté le 02-04-2003 à 11:01:23    

effectivement c'est bizarre  :??:  
 
Si ca marche c tant mieux, mais je dos dire que je ne peux pas t'aider.
Par contre si tu trouve le pourquoi du comment ca m'interesse  :)

Reply

Marsh Posté le 02-04-2003 à 11:04:15    

Hééééé merde, non, en fait ça n'marche pas. Apparement, dans une sous requète, on ne peut pas mettre de clauste OrderBy !
En tout cas, la requète que je viens de donner ne marche pas. Elle marche uniquement quand j'enlève la clause OrderBy de la sous requète sur laquelle elle est basée!!!  :fou:  :fou:  :fou:  :fou:

Reply

Marsh Posté le 02-04-2003 à 11:22:04    

essaye ca :  
 
Select VAL1, VAL2, VAL3, VAL4, VAL5 from (Select VAL1, VAL2, VAL3, VAL4, VAL5, rownum RN from MATABLE where rownum <= 21 and  VAL1 like 'C3%' ) where RN between 10 and 20 Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;
 
pit-etre que ca marche  :??:  

Reply

Marsh Posté le 02-04-2003 à 11:29:27    

cmoua a écrit :

essaye ca :  
 
Select VAL1, VAL2, VAL3, VAL4, VAL5 from (Select VAL1, VAL2, VAL3, VAL4, VAL5, rownum RN from MATABLE where rownum <= 21 and  VAL1 like 'C3%' ) where RN between 10 and 20 Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;
 
pit-etre que ca marche  :??:  
 


 
Merci, ça marche surement, mais ça ne correspond plus à ce dont g besoin : avec ce que tu me donnes, le tri va être fait APRES la sélection des enregistrements 10 à 20. Moi je voudrais que, pour déterminer les enregistrements 10 à 20, le tri soit pris en compte.

Reply

Marsh Posté le 02-04-2003 à 11:30:08    

El_gringo a écrit :

Je n'comprend pas un truc.
j'ai la requête suivante :


Select VAL1, VAL2, VAL3, VAL4, VAL5 from MATABLE where rownum > 0 and rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;


 
Cette requête me rend 21 résultats.
Et si je fais cette requête là (changement : "rownum > 10" ):


Select VAL1, VAL2, VAL3, VAL4, VAL5 from MATABLE where rownum > 10 and rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC;


 
--> 0 résultats !!!! qqn voit une expliquation à ça ?
 
EDIT : Et pendant qu'on y est, si quelqu'un sait faire la même chose avec MySQL, et avec SQLServer, je suis prenneur ! :D


Ben le rownum sous Oracle ne fonctionne pas comme tu le souhaites ( il n'y a pas d'équivalent à limit de MySQL sous Oracle). Rownum ne correspond pas au numéro d'enregistrement dans une table, mais au numéro d'enregistrement du résultat après reception des résultats. Donc, tu ne peut que l'utilisé pour faire rownum < [nombre] mais pas rownum > [nombre].
Seule soluton : http://callista.free.fr/php_oracle/faq/faq.html#6

Reply

Marsh Posté le 02-04-2003 à 11:30:08   

Reply

Marsh Posté le 02-04-2003 à 11:36:50    

tomlameche a écrit :


Ben le rownum sous Oracle ne fonctionne pas comme tu le souhaites ( il n'y a pas d'équivalent à limit de MySQL sous Oracle). Rownum ne correspond pas au numéro d'enregistrement dans une table, mais au numéro d'enregistrement du résultat après reception des résultats. Donc, tu ne peut que l'utilisé pour faire rownum < [nombre] mais pas rownum > [nombre].
Seule soluton : http://callista.free.fr/php_oracle/faq/faq.html#6


 
Merci, c'est ce que j'avais déja fais (1 peu + haut ds le topic) :


Select VAL1, VAL2, VAL3, VAL4, VAL5 from (Select VAL1, VAL2, VAL3, VAL4, VAL5, rownum RN from MATABLE where rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC) where RN between 10 and 20;


 
Mais apparement, il ne veut pas de Order by dans une sous requête !??

Reply

Marsh Posté le 02-04-2003 à 11:45:00    

El_gringo a écrit :


 
Merci, c'est ce que j'avais déja fais (1 peu + haut ds le topic) :


Select VAL1, VAL2, VAL3, VAL4, VAL5 from (Select VAL1, VAL2, VAL3, VAL4, VAL5, rownum RN from MATABLE where rownum <= 21 and  VAL1 like 'C3%' Order By Val2 desc,Val4 asc,Val3 desc,Val5 ASC) where RN between 10 and 20;


 
Mais apparement, il ne veut pas de Order by dans une sous requête !??


Bizarre, je viens de tester et chez moi ca marche ...
Tu as un message d'erreur, ou c'est le résultat qui est pas bon ?

Reply

Marsh Posté le 02-04-2003 à 12:05:24    

tomlameche a écrit :


Bizarre, je viens de tester et chez moi ca marche ...
Tu as un message d'erreur, ou c'est le résultat qui est pas bon ?


 
Bizarre, comme tu dis.
Au lancement de cette requête, j'ai un message d'erreur:
ORA-00907: Parenthese de droite absente
Message hypra-explicite à la Oracle ! :(
Excuse, j'aurais du l'dire avant.
Mais t'as testé avec ma requête exactement, en créant des champs comme les miens !?
EDIT: sinon, avec quelle requête EXACTE as tu constaté que ça semble marcher ?


Message édité par El_gringo le 02-04-2003 à 12:08:19
Reply

Marsh Posté le 02-04-2003 à 12:12:48    

El_gringo a écrit :


 
Bizarre, comme tu dis.
Au lancement de cette requête, j'ai un message d'erreur:
ORA-00907: Parenthese de droite absente
Message hypra-explicite à la Oracle ! :(
Excuse, j'aurais du l'dire avant.
Mais t'as testé avec ma requête exactement, en créant des champs comme les miens !?
EDIT: sinon, avec quelle requête EXACTE as tu constaté que ça semble marcher ?


Voilà la requete exact qui fonctionne ( j'ai utilisé une table que j'avais sous la main ) :

Citation :

select a.nrv_code_geo, a.nrv_code_reseau
from (select r.NRV_CODE_GEO,  
r.NRV_CODE_RESEAU,  
 rownum rn
from TBSMV_NBMED_RES_VUS r
where rownum < 30  
order by r.NRV_CODE_GEO ) a
where a.RN between 10 and 30

Reply

Marsh Posté le 02-04-2003 à 12:20:38    

tomlameche a écrit :


Voilà la requete exact qui fonctionne ( j'ai utilisé une table que j'avais sous la main ) :

Citation :

select a.nrv_code_geo, a.nrv_code_reseau
from (select r.NRV_CODE_GEO,  
r.NRV_CODE_RESEAU,  
 rownum rn
from TBSMV_NBMED_RES_VUS r
where rownum < 30  
order by r.NRV_CODE_GEO ) a
where a.RN between 10 and 30




 
Je comprend pas, j'ai exécuté exactement ta requête sur ma base, en changeant juste le nom de la table, et les noms de colones, ce qui donne :


select a.val1, a.val2
from (select r.val1, r.val2, rownum rn from CHQ r where rownum < 30 order by r.val1) a
where a.RN between 10 and 30

 
 
--> ORA-00907: Parenthese de droite absente
Paf ! Hé merde.
t'as quelle version d'Oracle toi ?

Reply

Marsh Posté le 02-04-2003 à 13:23:38    

El_gringo a écrit :


 
Je comprend pas, j'ai exécuté exactement ta requête sur ma base, en changeant juste le nom de la table, et les noms de colones, ce qui donne :


select a.val1, a.val2
from (select r.val1, r.val2, rownum rn from CHQ r where rownum < 30 order by r.val1) a
where a.RN between 10 and 30

 
 
--> ORA-00907: Parenthese de droite absente
Paf ! Hé merde.
t'as quelle version d'Oracle toi ?


Dingue, ça ... Je suis sous la 8.1.7.3

Reply

Marsh Posté le 02-04-2003 à 14:14:22    

Moi j'ai la 8.0.5.0.0
Tu crois que ça peut venir du fait que ta version est plus récente ? Que la possibilité de faire ça ai été implémenté seulement entre nos 2 versions ?

Reply

Marsh Posté le 02-04-2003 à 16:19:59    

...ça inspire plus personne ce sujet ?

Reply

Marsh Posté le 02-04-2003 à 16:21:59    

El_gringo a écrit :

...ça inspire plus personne ce sujet ?


Désolé, j'ai pas d'idée. Fouille de ce coté là, tu trouveras peut être une réponse : http://www.orafaq.org

Reply

Marsh Posté le 19-06-2003 à 16:19:41    

J'ai exactement le meme probleme il veut pas de mon order dans ma sous requete  

Code :
  1. SQL> select l_nom, rownum from trpp_etatcivil where l_nom>(select l_nom from trpp_etatcivil where l_nom like 'A%' and rownum<10 order by l_nom);
  2. select l_nom, rownum from trpp_etatcivil where l_nom>(select l_nom from trpp_etatcivil where l_nom like 'A%' and rownum<10 order by l_nom)
  3.                                                                                                                            *
  4. ERROR at line 1:
  5. ORA-00907: missing right parenthesis


 
Version :
SQL*Plus: Release 8.1.7.0.0 - Production on Thu Jun 19 15:25:36 2003
 
[i]2000 Oracle Corporation.  All rights reserved.
 
 
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - 64bit Production
JServer Release 9.2.0.1.0 - Production

 
 
et en plus je viens de me rendre compte que le rownum ne prend pas en compte l'order by si c pas un order by sur une clé
 
exemple :

Code :
  1. SQL> select l_nom, rownum from trpp_etatcivil where l_nom like 'A%' ;
  2. L_NOM                              ROWNUM
  3. ------------------------------ ----------
  4. ALMIENTO                                1
  5. AKIL                                    2
  6. ATTYE                                   3
  7. AKSIL                                   4
  8. AWUDZI                                  5
  9. AMARI                                   6
  10. AWUDZI                                  7
  11. AISSAOUI                                8
  12. ADDOUDI                                 9
  13. ABAZ                                   10
  14. AUVRAY                                 11


 

Code :
  1. SQL> select l_nom, rownum from trpp_etatcivil where l_nom like 'A%' order by l_nom;
  2. L_NOM                              ROWNUM
  3. ------------------------------ ----------
  4. ABAD                                  113
  5. ABAOUB                                 86
  6. ABASSI                                 82
  7. ABAZ                                   10
  8. ABBAS                                  62
  9. ABBOU                                  45
  10. ABDEDDAIM                              64
  11. ABDELKADER                             67
  12. ABDELLI                                99
  13. ABDELMOUMENE                           66
  14. ABDELOUHAB                            100


 
Donc si on veut les dix premiers noms ca marche pas.

Code :
  1. SQL> select l_nom, rownum from trpp_etatcivil where l_nom like 'A%' and rownum<10 order by l_nom;
  2. L_NOM                              ROWNUM
  3. ------------------------------ ----------
  4. ADDOUDI                                 9
  5. AISSAOUI                                8
  6. AKIL                                    2
  7. AKSIL                                   4
  8. ALMIENTO                                1
  9. AMARI                                   6
  10. ATTYE                                   3
  11. AWUDZI                                  5
  12. AWUDZI                                  7
  13. 9 rows selected.


Message édité par Sebastien le 19-06-2003 à 16:20:30
Reply

Marsh Posté le 19-06-2003 à 16:27:27    


 
Dommage j'y ai cru un instant mais comme dit dans mon message precedent le num_row ne prend pas en compte l'order by.
 

Code :
  1. SQL> select * from (select l_nom, rownum rn from trpp_etatcivil order by l_nom) where rn between 0 and 10;
  2. L_NOM                                  RN
  3. ------------------------------ ----------
  4. ALMIENTO                                8
  5. BRUN                                    2
  6. COULIOU                                 6
  7. EHNIS                                  10
  8. GONZALEZ                                9
  9. LIZE                                    5
  10. LOPEZ                                   7
  11. MARGUERITE                              1
  12. SOUNI                                   4
  13. STANISIC                                3
  14. 10 rows selected.


Message édité par Sebastien le 19-06-2003 à 16:30:20
Reply

Marsh Posté le 19-06-2003 à 16:34:09    

Tout ce que je peux te dire, c'est que :
- les versions < 8i d'Oracle ne supportent pas les Order by dans des sous requêtes
- j'ai résolu mon problème avce le style de requète suivant :


        select a.val1 from (
           select val1, rownum RN from (select val1 from CHQ order by val1 desc)
        ) a where a.RN between 2 and 10


 
P'tet ben qu'ça t'aidera...
 
EDIT : en tout cas, j'en ai chié avec ce truc là !


Message édité par El_gringo le 19-06-2003 à 16:34:31
Reply

Marsh Posté le 19-06-2003 à 16:48:53    

Ouais ca marche, merci ca m'enleve une epine du pied, mais ca n'empeche que le DBA Oracle de ma boite il va entendre parler de mysql la :-p

Reply

Marsh Posté le 19-06-2003 à 17:06:29    

El_gringo a écrit :

Non, mais "rownum", c'est pas un colone de ma table MATABLE. en Oracle, rownum, c'est un numéro de ligne résultante. C'est censé permettre de récupérer les résultats 10 à 21 (par exemple) correspondant à une requète.


rownum est calculé tout à la fin, au niveau du recordset.
 
Donc tu ne peux t'en servir que pour faire un "top".
 
En aucun ça tu peux mettre une condition rownum > x, car au fur et à mesure qu'oracle va virer les lignes qui ne répondent pas à la condition, il va shooter populer rownum en repartant de 0, et recommencer à filtrer.
 
Seul MySQL est capable de récupérer des lignes de X à Y, tous les autres SGBD ne peuvent que récupérer les Y premières lignes.

Reply

Marsh Posté le 19-06-2003 à 18:03:58    

MagicBuzz a écrit :


rownum est calculé tout à la fin, au niveau du recordset.
 
Donc tu ne peux t'en servir que pour faire un "top".
 
En aucun ça tu peux mettre une condition rownum > x, car au fur et à mesure qu'oracle va virer les lignes qui ne répondent pas à la condition, il va shooter populer rownum en repartant de 0, et recommencer à filtrer.
 
Seul MySQL est capable de récupérer des lignes de X à Y, tous les autres SGBD ne peuvent que récupérer les Y premières lignes.


 
Ben, j'ai trouvé des combines puor faire l'équivalant sous Oracle (ci-dessus) et suos SQL Server

Reply

Marsh Posté le 19-06-2003 à 22:54:30    

El_gringo, je confirme si nécessaire, la solution que t'as trouvé est la seule à ma connaissance.
 
J'en ai chier aussi à l'époque ou je cherchais à faire la même chose !
 
http://forum.hardware.fr/forum2.ph [...] 805&cat=10
 
En fait sous Oracle, y'a une solution que je pouvait utiliser. Dans notre appli, on demandait à Oracle de générer le résultat en XML via le package XSU. Les procédures d'XSU permettent le fenêtrage du résultat. Mais ce package est en Java ! Et c'est lent... Très lent !
Alors maintenant, je fait avec 3 requêtes imbriqués si la requête d'origine ne retourne pas trop d'enregistrements.
Sinon je passe par une procédure stockée qui utilise un curseur qui saute le début, et qui s'arrête quand on a le nombre d'enregs voulu. A la fin, le XML est généré en PHP.
Et tout ce merdier est 3 fois plus rapide que la version XSU/Java !
 
Sinon, Oracle c'est quand même cool, le fenêtrage de MySql me manque, mais les possibilités et les perfs d'Oracle c'est quand mêm autre chose !
 
Pour finir, MagicBuzz, t'y va un peu fort ! :lol:  
Y'a pas que MySql qui sait faire çà, y'a aussi PostgreSql :  
http://www.postgresql.org/docs/vie [...] limit.html


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-06-2003 à 09:16:21    

Mara's dad a écrit :

El_gringo, je confirme si nécessaire, la solution que t'as trouvé est la seule à ma connaissance.
 
J'en ai chier aussi à l'époque ou je cherchais à faire la même chose !


 
Agrrrrrh, si tu m'avais dis que t'avais cherché à faire ça avant moi, ça m'aurait éviter de passer presque 2 jours là dessus  :(  
Sinon, sache que j'ai trouvé une autre solution pour faire ça sous Oracle (l'autre n'est donc pas la seule) :


        Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from (
            Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1  from CHQ Order By val1
        ) WHERE rownum <= %MAX_ROW%
        MINUS
        Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from (
            Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from CHQ Order By val1
        ) WHERE rownum <= %MIN_ROW% Order by val1

 
 
Où %MIN_ROW% et %MAX_ROW% sont les bornes.

Reply

Marsh Posté le 20-06-2003 à 09:57:32    

El_gringo a écrit :


 
Agrrrrrh, si tu m'avais dis que t'avais cherché à faire ça avant moi, ça m'aurait éviter de passer presque 2 jours là dessus  :(  
Sinon, sache que j'ai trouvé une autre solution pour faire ça sous Oracle (l'autre n'est donc pas la seule) :


        Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from (
            Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1  from CHQ Order By val1
        ) WHERE rownum <= %MAX_ROW%
        MINUS
        Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from (
            Select NUMDON, NUMIMAGE, NOPAGE, TYPE , VAL1 from CHQ Order By val1
        ) WHERE rownum <= %MIN_ROW% Order by val1

 
 
Où %MIN_ROW% et %MAX_ROW% sont les bornes.


 
Ben falait faire une recherche sur le forum !
 
Sinon, ta nouvelle solution, c'est vraiement le même genre, mais faut voir ce que çà donne au niveau perfs parce-que t'as quand même 2 fois le scan complet de la table. En théorie au moins, CAD sans compter les optimisations et les cache d'Oracle.
 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-06-2003 à 10:02:25    

Ya pas une erreur sur la borne inférieur : rownum <= %MIN_ROW%
 
Moi j'aurrais mis un '<' strict, non ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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