J'utilise une application (MapServer - http://mapserver.org/ ) qui encapsule les instructions SQL, de sorte que l'instruction ORDER BY se trouve dans la requête interne. Par exemple
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
L'application dispose de nombreux pilotes de base de données différents. J'utilise principalement le pilote MS SQL Server et SQL Server 2008. Cela génère une erreur si un ORDER BY est trouvé dans une sous-requête.
À partir de MS Docs (bien que ce soit pour SQL Server 2000, il semble toujours s'appliquer):
Lorsque vous utilisez une clause ORDER BY dans une vue, une fonction en ligne, une table dérivée ou une sous-requête, cela ne garantit pas la sortie ordonnée. Au lieu de cela, la clause ORDER BY est uniquement utilisée pour garantir que l'ensemble de résultats généré par l'opérateur Top a une composition cohérente. La clause ORDER BY garantit uniquement un jeu de résultats ordonné lorsqu'il est spécifié dans l'instruction SELECT la plus externe.
Cependant, le même type de requête lorsqu'il est exécuté dans Postgres (9) et Oracle renvoie des résultats - avec l'ordre défini dans la sous-requête. Dans Postgres, le plan de requête montre que les résultats sont triés et les notes de publication de Postgres incluent l'élément, ce qui implique que des ordres de sous-requête sont utilisés:
Évitez le tri lorsque la sous-requête ORDER BY correspond à la requête supérieure
http://en.wikipedia.org/wiki/Order_by déclare:
Bien que certains systèmes de base de données autorisent la spécification d'une clause ORDER BY dans les sous-sélections ou les définitions de vue, la présence n'a aucun effet.
Cependant, d'après ma propre vérification des plans de requête:
- SQL Server 2008 ne prend pas en charge ORDER BY dans une sous-requête
- Postgres 9 prend en charge ORDER BY dans une sous-requête
- Oracle 10g prend en charge ORDER BY dans une sous-requête
Donc, ma question existe-t-il des liens qui peuvent officiellement confirmer ou nier que Postgres et Oracle n'autorisent pas le tri dans une sous-requête?
ORDER BY
dans la sous-requête comme redondant et ne feraient pas le tri inutile.