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

Limiter le nombre de résultat d'une requette [ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 25-02-2004 à 09:29:22    

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

Reply

Marsh Posté le 25-02-2004 à 09:29:22   

Reply

Marsh Posté le 25-02-2004 à 09:33:03    

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

Reply

Marsh Posté le 25-02-2004 à 18:29:40    

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

Reply

Marsh Posté le 26-02-2004 à 11:50:20    

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

Reply

Marsh Posté le 27-02-2004 à 08:29:40    

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

Reply

Marsh Posté le 27-02-2004 à 09:45:32    

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

Reply

Marsh Posté le 02-03-2004 à 23:46:41    

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)

Reply

Marsh Posté le 02-03-2004 à 23:50:18    

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

Reply

Marsh Posté le 03-03-2004 à 08:48:13    

Merci pour tes explications  :jap:

Reply

Marsh Posté le 03-03-2004 à 09:47:07    

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.

Reply

Sujets relatifs:

Leave a Replay

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