récuérer les enregistrements n à m résultants d'une requête [oracle] - SQL/NoSQL - Programmation
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
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.
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
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 :
|
Comme ça, c'est vrai que ça marche, mais j'trouve ça bizard quand même...
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
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!!!
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
Marsh Posté le 02-04-2003 à 11:29:27
cmoua a écrit : essaye ca : |
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.
Marsh Posté le 02-04-2003 à 11:30:08
El_gringo a écrit : Je n'comprend pas un truc.
|
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
Marsh Posté le 02-04-2003 à 11:36:50
tomlameche a écrit : |
Merci, c'est ce que j'avais déja fais (1 peu + haut ds le topic) :
|
Mais apparement, il ne veut pas de Order by dans une sous requête !??
Marsh Posté le 02-04-2003 à 11:45:00
El_gringo 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 ?
Marsh Posté le 02-04-2003 à 12:05:24
tomlameche 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 ?
Marsh Posté le 02-04-2003 à 12:12:48
El_gringo 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 |
Marsh Posté le 02-04-2003 à 12:20:38
tomlameche 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 :
|
--> ORA-00907: Parenthese de droite absente
Paf ! Hé merde.
t'as quelle version d'Oracle toi ?
Marsh Posté le 02-04-2003 à 13:23:38
El_gringo a écrit :
|
Dingue, ça ... Je suis sous la 8.1.7.3
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 ?
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
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 :
|
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 :
|
Code :
|
Donc si on veut les dix premiers noms ca marche pas.
Code :
|
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 :
|
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 :
|
P'tet ben qu'ça t'aidera...
EDIT : en tout cas, j'en ai chié avec ce truc là !
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
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.
Marsh Posté le 19-06-2003 à 18:03:58
MagicBuzz a écrit : |
Ben, j'ai trouvé des combines puor faire l'équivalant sous Oracle (ci-dessus) et suos SQL Server
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 !
Y'a pas que MySql qui sait faire çà, y'a aussi PostgreSql :
http://www.postgresql.org/docs/vie [...] limit.html
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. |
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) :
|
Où %MIN_ROW% et %MAX_ROW% sont les bornes.
Marsh Posté le 20-06-2003 à 09:57:32
El_gringo a écrit :
|
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+
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 ?
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 !
Message édité par El_gringo le 02-04-2003 à 10:01:16