En supposant que vous essayez de générer des pages de données et en supposant que votre désir est que les résultats sont stables et cohérentes si les données du tableau ne change pas (chaque ligne de la requête interne est renvoyée sur exactement une page des résultats que vous modifiez les limites supérieure et inférieure), l'approche la plus efficace serait essentiellement ce que vous avez publié initialement. Mais vous devez ajouter un ORDER BY
à la requête interne. Dans le cas contraire, il serait tout à fait correct pour Oracle pour retourner une ligne de données sur chaque page ou de ne jamais renvoyer une ligne sur une page
SELECT orderid
FROM (SELECT orderid, rownum r
FROM (SELECT orderid
FROM myorders
WHERE ordertype = 'E'
AND orderstatus = 'A'
ORDER BY <<something>>) a
WHERE rownum < 86)
WHERE r > 84
Si vous êtes vraiment plus préoccupés par la lisibilité de la performance, vous pourriez réduire un niveau d'imbrication en faisant quelque chose comme
SELECT orderid
FROM (SELECT orderid,
rank() over (order by <<something>>) rnk
FROM myorders
WHERE ordertype = 'E'
AND orderstatus = 'A')
WHERE rnk > 84
AND rnk < 86
Dans 12c Oracle, Oracle devrait soutenir la norme ANSI FETCH
et OFFSET
mots-clés pour simplifier la syntaxe un peu plus loin.
il est inutile de prendre les lignes 84 à 86 si vous n'appliquez aucune sorte sur la table .... qu'est-ce que vous essayez d'atteindre ici? – haki
qu'en est-il d'ordertype et d'orderstatus dans votre deuxième solution? –
Je ne vois même pas comment votre première requête va compiler parce que vous sélectionnez rownum d'une sous-requête qui ne le contient pas. –