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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°349783
El_gringo
Posté le 02-04-2003 à 09:50:50  profilanswer
 

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
mood
Publicité
Posté le 02-04-2003 à 09:50:50  profilanswer
 

n°349844
cmoua
Posté le 02-04-2003 à 10:26:03  profilanswer
 

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
n°349848
El_gringo
Posté le 02-04-2003 à 10:30:57  profilanswer
 

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.

n°349865
cmoua
Posté le 02-04-2003 à 10:51:32  profilanswer
 

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
n°349872
El_gringo
Posté le 02-04-2003 à 10:55:15  profilanswer
 

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
n°349881
cmoua
Posté le 02-04-2003 à 11:01:23  profilanswer
 

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  :)

n°349886
El_gringo
Posté le 02-04-2003 à 11:04:15  profilanswer
 

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:

n°349930
cmoua
Posté le 02-04-2003 à 11:22:04  profilanswer
 

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  :??:  

n°349947
El_gringo
Posté le 02-04-2003 à 11:29:27  profilanswer
 

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.

n°349952
tomlameche
Et pourquoi pas ?
Posté le 02-04-2003 à 11:30:08  profilanswer
 

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

mood
Publicité
Posté le 02-04-2003 à 11:30:08  profilanswer
 

n°349964
El_gringo
Posté le 02-04-2003 à 11:36:50  profilanswer
 

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 !??

n°349982
tomlameche
Et pourquoi pas ?
Posté le 02-04-2003 à 11:45:00  profilanswer
 

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 ?

n°350011
El_gringo
Posté le 02-04-2003 à 12:05:24  profilanswer
 

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
n°350025
tomlameche
Et pourquoi pas ?
Posté le 02-04-2003 à 12:12:48  profilanswer
 

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

n°350030
El_gringo
Posté le 02-04-2003 à 12:20:38  profilanswer
 

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 ?

n°350073
tomlameche
Et pourquoi pas ?
Posté le 02-04-2003 à 13:23:38  profilanswer
 

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

n°350118
El_gringo
Posté le 02-04-2003 à 14:14:22  profilanswer
 

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 ?

n°350293
El_gringo
Posté le 02-04-2003 à 16:19:59  profilanswer
 

...ça inspire plus personne ce sujet ?

n°350296
tomlameche
Et pourquoi pas ?
Posté le 02-04-2003 à 16:21:59  profilanswer
 

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

n°433171
Sebastien
Posté le 19-06-2003 à 16:19:41  profilanswer
 

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
n°433203
Sebastien
Posté le 19-06-2003 à 16:27:27  profilanswer
 


 
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
n°433222
El_gringo
Posté le 19-06-2003 à 16:34:09  profilanswer
 

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
n°433248
Sebastien
Posté le 19-06-2003 à 16:48:53  profilanswer
 

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

n°433265
MagicBuzz
Posté le 19-06-2003 à 17:06:29  profilanswer
 

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.

n°433302
El_gringo
Posté le 19-06-2003 à 18:03:58  profilanswer
 

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

n°433532
Mara's dad
Yes I can !
Posté le 19-06-2003 à 22:54:30  profilanswer
 

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é.
n°433966
El_gringo
Posté le 20-06-2003 à 09:16:21  profilanswer
 

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.

n°434003
Mara's dad
Yes I can !
Posté le 20-06-2003 à 09:57:32  profilanswer
 

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é.
n°434010
Mara's dad
Yes I can !
Posté le 20-06-2003 à 10:02:25  profilanswer
 

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é.
mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
compter simplement les enregistrements d'une table SQL..requete foireuse ou pas ?
problemen requete sql et phpcomment installer/configurer oracle ?
Variable et requete Mysql[Oracle] comment gérer la sous-requete + pb de constitution d'1 vue
Peut on attaquer une base de donnée ORACLE depuis le php ou autrecomment faire un paquetage avec des procedures sous oracle
logger les connections a une base ORACLE ? 
Plus de sujets relatifs à : [oracle] récuérer les enregistrements n à m résultants d'une requête


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