OVH Cloud OVH Cloud

Oracle + Clause 'Order By' dans une sous-requete

3 réponses
Avatar
bob
Bonjour tout le monde,

J'ai un petit problème avec une petite requete que je pourrais résumer par
ce qui suit

SELECT r_num, T.Field1, T.Fiel2
FROM (
SELECT rownum as r_num,
Field1,Field2
FROM table1
order by field1
) T
where r_num between 1 and 5

En fait, la clause Order By dans la sous-reqête ne fontionne pas, je ne sais
si j'ai le droit de faire ça.
En tout cas, comme j'ai besoin de faire de la synchronisation pour une
applic, j'ai besoin que les enregistrement soit triés dans le résultat de la
sous requête. Y a-t-il un moyen pour cela?

Merci d'avance pour votre aide

Bob

3 réponses

Avatar
Bruno Baguette
Le Fri, 27 Feb 2004 11:34:25 +0100, bob a écrit :

Bonjour,

En fait, la clause Order By dans la sous-reqête ne fontionne pas, je ne
sais si j'ai le droit de faire ça.
En tout cas, comme j'ai besoin de faire de la synchronisation pour une
applic, j'ai besoin que les enregistrement soit triés dans le résultat
de la sous requête. Y a-t-il un moyen pour cela?



J'avoue que je ne vois pas le but de la sous-requête ici, est-ce que
cette requête ne répond pas à vos souhaits ?

SELECT rownum as r_num,Field1,Field2
FROM table1
WHERE r_num BETWEEN 1 AND 5
ORDER BY Field1;

Si la sous-requête vous est indispensable, je sortirais carrément le
ORDER BY de la sous-requête car je doute que cette clause soit utilisée
dans une sous-requête (mais je peux me tromper) :

SELECT r_num, T.Field1, T.Fiel2
FROM (
SELECT rownum AS r_num,Field1,Field2
FROM table1
) T
WHERE r_num BETWEEN 1 AND 5
ORDER BY T.Field1

Essayez toujours ces deux requêtes et dites nous si cela correspond à ce
que vous cherchez ou non, avec des détails :-)

Cordialement,

--
----------------------------------------
Bruno Baguette -

Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL
Avatar
bob
En fait j'utilisais votre deuxième requête au départ mais je me suis aperçu
que le tri ne se faisait pas en fonction de la sous requête mais des
résultats conditionnés par le rownum. La première ne peut fonctionner que si
j'ai un 'Where rownum < uneValeur' mais pas avec 'WHERE rownum between debut
and fin', car le rownum est à chaque fois décalé, et au final, rien de sort
de cette requête. Vous pouvez d'ailleurs le vérifier assez facilement.

Le but de ma requête est de pouvoir faire de la pagination, donc de renvoyé
les résultats en fonction d'une page précis, d'où la condition 'WHERE r_num
BETWEEN debut AND fin'

En fait ma requête fonctionne bien, mais seulement à partir de la version
8i, or je suis sur une version 8.0.5. Au final, je suis obligé de trouver
une autre solution.

Mais merci de votre attention

"Bruno Baguette" a écrit dans le message news:

Le Fri, 27 Feb 2004 11:34:25 +0100, bob a écrit :

Bonjour,

> En fait, la clause Order By dans la sous-reqête ne fontionne pas, je ne
> sais si j'ai le droit de faire ça.
> En tout cas, comme j'ai besoin de faire de la synchronisation pour une
> applic, j'ai besoin que les enregistrement soit triés dans le résultat
> de la sous requête. Y a-t-il un moyen pour cela?

J'avoue que je ne vois pas le but de la sous-requête ici, est-ce que
cette requête ne répond pas à vos souhaits ?

SELECT rownum as r_num,Field1,Field2
FROM table1
WHERE r_num BETWEEN 1 AND 5
ORDER BY Field1;

Si la sous-requête vous est indispensable, je sortirais carrément le
ORDER BY de la sous-requête car je doute que cette clause soit utilisée
dans une sous-requête (mais je peux me tromper) :

SELECT r_num, T.Field1, T.Fiel2
FROM (
SELECT rownum AS r_num,Field1,Field2
FROM table1
) T
WHERE r_num BETWEEN 1 AND 5
ORDER BY T.Field1

Essayez toujours ces deux requêtes et dites nous si cela correspond à ce
que vous cherchez ou non, avec des détails :-)

Cordialement,

--
----------------------------------------
Bruno Baguette -

Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL
Avatar
Bruno Baguette
Le Fri, 27 Feb 2004 13:40:58 +0100, bob a écrit :

re-Bonjour :-)

Le but de ma requête est de pouvoir faire de la pagination, donc de
renvoyé les résultats en fonction d'une page précis, d'où la
condition 'WHERE r_num BETWEEN debut AND fin'

En fait ma requête fonctionne bien, mais seulement à partir de la
version 8i, or je suis sur une version 8.0.5. Au final, je suis obligé
de trouver une autre solution.



Pour faire de la pagination pour une requête, j'utilise la clause LIMIT
(nombre de tuples maximum) et la clause OFFSET (point de départ).

En incrémentant l'OFFSET à chaque page, j'obtiens ainsi une pagination.

Je travaille essentiellement sous PostgreSQL, mais je serais tout de même
étonné qu'Oracle ne possède pas ces clauses.

Sur certains SGBD, ce genre de requête (avec OFFSET) est parfois mise en
cache (query cache) afin de donner des réponses plus rapides pour une
requête identique mais avec un OFFSET différent.

Mais merci de votre attention



De rien, le forum sert à ca :-)

Cordialement,

PS : Faites attention de répondre en dessous du message et de ne citer
que la partie du message nécessaire à la compréhension. (cf.
http://giromini.org/usenet-fr/repondre.html) :-)

--
----------------------------------------
Bruno Baguette -

Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL