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.