Existe-t-il un moyen de faire un Oracle
se comporte comme si elle contenait une requête MySQL limit
clause ?
Dans MySQL, je peux faire cela :
select *
from sometable
order by name
limit 20,10
pour obtenir les 21e à 30e rangs (sautez les 20 premiers, donnez les 10 suivants). Les rangs sont sélectionnés après le order by
Il faut donc commencer par le 20ème nom par ordre alphabétique.
Dans Oracle, la seule chose que les gens mentionnent est la rownum
pseudo-colonne, mais elle est évaluée avant order by
ce qui signifie ceci :
select *
from sometable
where rownum <= 10
order by name
retournera un ensemble aléatoire de dix lignes classées par nom, ce qui n'est généralement pas ce que je veux. Elle ne permet pas non plus de spécifier un décalage.
21 votes
Normalisé dans SQL:2008.
1 votes
Il semble que l'offset et le row_count soient inversés dans votre premier exemple MySQL. Cette requête sélectionnera les lignes 11 à 30, et non 21 à 30.
16 votes
Limite a été annoncé par Tom Kyte pour Oracle 12c...
0 votes
Considérez que c'est hors sujet mais j'ai du mal à imaginer des cas d'utilisation réels où vous avez besoin d'extraire des données du milieu d'un ensemble de données. Je ne plaisante pas. Peut-être que je suis juste un chanceux qui n'a pas encore rencontré de telles exigences. Si quelqu'un pouvait donner un exemple basé sur une expérience réelle...
18 votes
Récupérer la page suivante dans un ensemble de résultats ?
6 votes
@YaroslavShabalin En particulier, une recherche par page utilise ce modèle tous l'heure. Presque toutes les applications ayant une fonction de recherche vont l'utiliser. Un autre cas d'utilisation serait de ne charger qu'une partie d'une longue liste ou d'un tableau côté client et de donner à l'utilisateur la possibilité de l'étendre.
2 votes
@MathieuLongtin @jpmc26 Dans google, commencez-vous par la page numéro 10 ? Pourquoi avoir besoin d'exécuter la requête à chaque fois que la page suivante est chargée quand on peut l'exécuter une fois, ouvrir le curseur et naviguer en chargeant une certaine partie du jeu de données ? Oui, vous devez vous occuper de la gestion de la mémoire si le jeu de résultats est important, mais vous évitez les incohérences possibles. Considérez que le nombre de lignes dans le jeu de résultats change, à chaque fois que vous relancez la requête avec la méthode ci-dessus.
limit 20,10
vous pouvez obtenir des résultats différents.4 votes
@YaroslavShabalin Vous ne pouvez pas obtenir un ensemble de résultats différent, à moins que les données sous-jacentes ne changent à cause de l'opération.
ORDER BY
. C'est tout l'intérêt de commander en premier. Si les données sous-jacentes changent et que votre ensemble de résultats change en conséquence, pourquoi ne pas montrer à l'utilisateur les résultats mis à jour au lieu des informations périmées ? De plus, la gestion des états est un fléau à éviter autant que possible. C'est une source constante de complications et de bogues ; c'est pourquoi le fonctionnel devient si populaire. Et quand sauriez-vous qu'il faut faire expirer l'ensemble des résultats en mémoire ? Dans le web, vous n'avez aucun moyen de savoir quand l'utilisateur s'en va.2 votes
@jpmc26 OK, je comprends votre point de vue. Maintenant, ça a du sens.
4 votes
@YaroslavShabalin - ouvrir un curseur et le maintenir ouvert pendant une période prolongée dans un scénario multi-utilisateurs est un bon moyen de faire des nœuds dans une base de données relationnelle. Dans une base de données mono-utilisateur, cela n'a probablement pas d'importance, mais lorsque vous avez des centaines de connexions simultanées, cela risque fort d'entraîner des problèmes. Les bases de données relationnelles sont généralement conçues comme des bases de données transactionnelles avec des durées de transaction relativement courtes. YMMV. Partagez et appréciez.
1 votes
Ver Comment fonctionne la pagination dans Oracle SQL
1 votes
Voir aussi La pagination avec Oracle
0 votes
youtube.com/watch?v=rhOVF82KY7E