Oracle, SQL et LIMIT

Sous Oracle, le langage SQL ne comporte pas la fonction LIMIT, bien utile pour paginer les résultats d'une requête SELECT. Afin de pallier à cette absence, il est possible d'utiliser la pseudo-colonne ROWNUM.

Ainsi, pour ne prendre en compte que la 1ère ligne de résultats d'un SELECT:

SELECT <colonne_1>, &lt;colonne_n&gt;

FROM <table_1>, &lt;table_n&gt; WHERE <conditions> AND ROWNUM = 1;

Si vous souhaitez les résultats à partir de la 10ème ligne jusqu'à la 20ème:

SELECT <colonne_1>, &lt;colonne_n&gt;

FROM <table_1>, &lt;table_n&gt; WHERE <conditions> AND ROWNUM BETWEEN 10 AND 20;

Vous l'aurez compris, cette colonne s'utilise comme n'importe quelle autre colonne de type numérique, il est donc possible d'y appliquer tous les opérateurs habituels (=, <, >, =<, >=, BETWEEN, ...)

Comments

voilà ce que pear::db fait pour simuler le limit avec oracle

pour une requête initiale comme ça :

SELECT colonne1, colonne2
FROM table1
WHERE conditions

si on veut seulement les lignes entre x et y, il faut la transformer ainsi :


SELECT colonne1, colonne2
FROM (SELECT rownum as linenum, colonne1, colonne2
FROM table1
WHERE conditions
)
WHERE linenum BETWEEN x AND y

voilà ce que pear::db fait pour simuler le limit avec oracle

pour une requête initiale comme ça :

SELECT colonne1, colonne2
FROM table1
WHERE conditions

si on veut seulement les lignes entre x et y, il faut la transformer ainsi :


SELECT colonne1, colonne2
FROM (SELECT rownum as linenum, colonne1, colonne2
FROM table1
WHERE conditions
)
WHERE linenum BETWEEN x AND y

Cela semble marcher mais pas n'importe quand

J'essaie cette astuce (incroyable qu'il n'y a pas de LIMIT dans Oracle) dans SQL Tools - résultat, cela marche quand BETWEEN 1 AND 200 (par exemple), mais cela ne marche pas pour tout autre cas du rang de départ (BETWEEN 10 AND 200 ne marche pas par exemple).
Bizarre, ou qq chose que je n'ai pas compris

C'est normal, comme expliqué

C'est normal, comme expliqué ci après : (trouvé ailleurs sur le web) The only meaningful use of ROWNUM in a WHERE clause is ... WHERE ROWNUM < constant because the value of ROWNUM increases only when a row is retrieved. The following search condition can never be met because the first four rows are not retrieved: ... WHERE ROWNUM = 5 the only caveat to this is ... WHERE ROWNUM = 1 Voilà pourquoi... ce qui est somme toute assez logique... Et pour les expressions avec Group By, je pense que transformer la requête avec le group by en sous requête fait l'affaire : select rownum, t1.* from ( SELECT... ) t1 WHERE rownum <= 5;

Fonctionne très bien sous

Fonctionne très bien sous Oracle 10g.
Merci de l'astuce !

d'autan que group by foire

d'autan que group by foire complètement la chose

L'exemple ne fonctionnne pas

L'exemple ne fonctionnne pas sous Oracle !

limit

tout a fait
ca n'existe pas sous Oracle !

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <pre>. The supported tag styles are: <foo>, [foo].

More information about formatting options