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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [ORACLE] Limiter le nombre de résultat d'une requette

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ORACLE] Limiter le nombre de résultat d'une requette

n°654167
thecoin
Chasseur de chasseur de canard
Posté le 25-02-2004 à 09:29:22  profilanswer
 

Je voudrai savoir si il est possible sous Oracle de limiter le nombre de ligne retourné par une requette comme dans MySql?

mood
Publicité
Posté le 25-02-2004 à 09:29:22  profilanswer
 

n°654174
thecoin
Chasseur de chasseur de canard
Posté le 25-02-2004 à 09:33:03  profilanswer
 

Je viens de trouver la réponse, avec "rownum". Exist-il une autre manière?

n°654983
MagicBuzz
Posté le 25-02-2004 à 18:29:40  profilanswer
 

non, pas d'autre moyen. Oracle doit être le plus pauvre des SGBD à ce niveau, surtout que ROWNUM est un gros piège...
 
Select * from la_table where rownum > 2
 
=> Ca retourne rien :D Parceque chaque ligne "retournée" est avec rownum = 1, donc ignorée, et la suivante a aussi 1, puisque rownum correspond à l'indice dans le curseur retourné, et non pas la position des données dans le flux retourné par la requête :)

n°656038
saxgard
Posté le 26-02-2004 à 11:50:20  profilanswer
 

thecoin a écrit :

Je voudrai savoir si il est possible sous Oracle de limiter le nombre de ligne retourné par une requette comme dans MySql?


 
c'ets une valeur précise de nbr d'enregistrement quetu veux ?
 
sinon tu peu faire en fonction de certain champs de ta table  
et dire "champ between ... and ..."
 
enfin ce genre de chose

n°657187
thecoin
Chasseur de chasseur de canard
Posté le 27-02-2004 à 08:29:40  profilanswer
 

Je veux simplement ramener les 500 premieres lignes d'une requete par exemple.

n°657226
MagicBuzz
Posté le 27-02-2004 à 09:45:32  profilanswer
 

donc t'as pas d'autre choix que faire where rownum < 500

n°661600
lohworm
Posté le 02-03-2004 à 23:46:41  profilanswer
 

oui mais il faut l'écrire comme ça (exemple):
 
select * from (ma_requete) where rownum<500
 
exemple :
select * from (select nom,prenom from table_les_gens order by nom) where rownum<500
 
et ça ne marche qu'avec rownum<qqchose
car les rownum sont évalués au fur et à mesure, ou je ne sais trop comment, donc pas moyen d'avoir les résultats de la 100 à la 200ème ligne avec un "rownum>100 and rownum<200", ni avec un between...
 
(en tout cas avec Oracle 8...après je ne sais pas)

n°661604
lohworm
Posté le 02-03-2004 à 23:50:18  profilanswer
 

mais attention : si cela ne renverra bien que les 500 premiers par exemple, ce qui permet de limiter le flux de données transitant, il aura quand même probablement fallu à oracle l'exécution de la (sous-)requete complète (surtout si il y a un order by) pour savoir quelles sont les "bonnes" 500 premières lignes à renvoyer

n°661668
thecoin
Chasseur de chasseur de canard
Posté le 03-03-2004 à 08:48:13  profilanswer
 

Merci pour tes explications  :jap:

n°661716
MagicBuzz
Posté le 03-03-2004 à 09:47:07  profilanswer
 

lohworm :
- La sous-requête n'est utile que si tu as un ORDER BY. En effet, ROWNUM filtre les données avant le ORDER BY dans la requête, donc si on veut prendre en compte l'ordre des données, il faut faire une sous-requête. Mais si on se moque de l'ordre, pas besoin de sous-requête, et à ce moment, seules les x premières lignes sont effectivement lues (donc extrêment performant)
 
- On ne peux pas filtrer de 100 à 200 simplement parceque ROWNUM correspond à un ID interne au curseur. Lors de l'exécution de la requête, les lignes retournées par la requête sont numérotées de 1 à x, et c'est ce ROWNUM. Hors, cela concerne TOUTE la clause where. Donc, si on rajoute un filtre, même sur ROWNUM, ce ROWNUM partira de toute façon de 1. Pour cette raison, on ne peut limiter que les X première lignes, et non pas de la ligne X à la ligne Y, car dans ce cas, chaque ligne candidate à la requête va se voir attribuée l'ID 1, et donc éjectée, la suivante se retrouve avec 1 aussi, donc éjectée de la même façon, et ainsi de suite.
 
SELECT * FROM latable WHERE ROWNUM IN (1, 2, 3, 4, 5)
-> Retourne 5 lignes (les 5 premières)
 
SELECT * FROM latable WHERE ROWNUM IN (1, 3, 4, 5) -- Sans la ligne 2
-> Retourne une unique ligne, puisque toutes les lignes suivantes ont tenté d'avoir pour valeur ROWNUM = 2 et ont dont été jetées.


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

  [ORACLE] Limiter le nombre de résultat d'une requette

 

Sujets relatifs
[PLSQL Oracle] : curseur avec table n'existant pas encore en paramètre[PHP] Nombre de ligne que contient une variable ?
problem de donnees sous oracle[Oracle 8i] Liaison avec Access : Perte des décimales
[Oracle 9.2] pb de select from dual sur oracle 9.2[Oracle 8.1.7] : réduire la taille d'un datafile
probleme avec variable de session (sou oracle)Convertir mysql_result -->ORACLE??
Pbs de perfs d'un serveur oraclerequête qui donne le résultat de deux select ?
Plus de sujets relatifs à : [ORACLE] Limiter le nombre de résultat d'une requette


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