Je suis en train de lire un vieux code au travail, et j'ai remarqué qu'il y a plusieurs vues avec une balise order by 1
clause. Qu'est-ce que cela accomplit ?
Exemple :
Create view v_payment_summary AS
SELECT A.PAYMENT_DATE,
(SELECT SUM(paymentamount)
FROM payment B
WHERE PAYMENT_DATE = B.PAYMENT_DATE
and SOME CONDITION) AS SUM_X,
(SELECT SUM(paymentamount)
FROM payment B
WHERE PAYMENT_DATE = B.PAYMENT_DATE
and SOME OTHER CONDITION) AS SUM_Y
FROM payment A
ORDER BY 1;
6 votes
Pour information : il est généralement considéré comme une mauvaise pratique d'avoir un ORDER BY dans les vues, à moins que vous puissiez garantir que la vue ne sera jamais utilisée que pour la présentation. C'est un gaspillage parce que le ORDER BY se produira 2x si vous utilisez la vue dans une autre requête avec un ORDER BY.
3 votes
@OMG Ponies : il est généralement considéré comme illégal d'avoir un
ORDER BY
dans unVIEW
. Le SQL standard ne le permet pas. SQL Server l'a interdit depuis 2005. Pour les implémentations SQL qui l'autorisent, le comportement est largement non documenté et contre intuitif. En d'autres termes, il faut absolument l'éviter.0 votes
@onedaywhen : Tu prêches un convaincu, mais MySQL permet ORDER BY dans les vues comme le fait Oracle IME. Le serveur SQL autorise un ORDER BY si
TOP
est présent, et SSMS aime ajouterTOP 100 PERCENT
.0 votes
@OMG Ponies@ "MySQL permet ORDER BY dans les vues" -- MySQL permet une
CHECK
dans unCREATE TABLE
mais elle ne l'honore pas réellement - elle n'est jamais vérifiée ! La question est de savoir si ces produits SQL honneur le siteORDER BY
dans les vues, par exemple lorsqu'elles sont utilisées dans une requête qui comporte également une fonctionORDER BY
Le problème est-il réglé deux fois ? Est-ce qu'ils documentent même le comportement ou faut-il regarder les plans d'exécution pour le découvrir ? Je pense que nous connaissons les réponses ;)0 votes
FYI Je viens de découvrir une autre utilisation pour
ORDER BY 1
...en utilisant une astuce d'application croisée où vous voulez un alias vide. Malheureusement le code e.g. est trop gros pour un commentaire donc je l'ai posté comme réponse ci-dessous pour votre information.