Limiter le nombre de résultat d'une requette [ORACLE] - SQL/NoSQL - Programmation
Marsh Posté le 25-02-2004 à 09:33:03
Je viens de trouver la réponse, avec "rownum". Exist-il une autre manière?
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 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
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
Marsh Posté le 27-02-2004 à 08:29:40
Je veux simplement ramener les 500 premieres lignes d'une requete par exemple.
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)
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
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.
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?