10
votes

Est l'ordre par clause autorisée dans une sous-requête

Y a-t-il une raison pour laquelle ou pourquoi ne devriez-vous pas faire une "commande par" dans une sous-requête?


0 commentaires

9 Réponses :


11
votes

Vous devez l'utiliser si la sous-requête utilise une sorte de type limite / haut .

SQL Server ne le permettra que si le La sous-requête contient top ou de la clause XML aussi: xxx


0 commentaires

1
votes

Vous pouvez le faire, mais je ne voudrais généralement pas que vous n'ayez pas besoin.

L'optimiseur l'ignorera (ou lancer une erreur?)

voir " matérialisation intermédiaire " pour certains usages.


0 commentaires

1
votes

En fonction de la taille de la sous-requête, il aura une incidence sur la performance à un degré variable.

L'ordre n'aurait pas d'importance sur une sous-requête cependant. Vous devriez être capable de déplacer la commande par partie à la requête extérieure (qui devrait être celle qui renvoie les résultats finaux).


0 commentaires

13
votes

Oui: cela ne devrait pas être fait, car il n'a pas de sens conceptuellement.

La sous-requête sera utilisée dans une requête extérieure (sinon elle serait inutile), et que la requête extérieure devra commander de toute façon, il n'ya donc aucun point de commander la sous-requête.

C'est parce que la requête donne lieu à SQL ne viendra aucun ordre particulier, à moins que vous n'utilisiez une commande explicite. Donc, même si vous avez utilisé commande dans la sous-requête, vous n'avez aucune garantie que cela affectera l'ordre des résultats de la requête extérieure; C'est donc inutile.

Cela peut bien sûr faire une différence dans certains SGDB spécifiques en raison de sa mise en œuvre, mais qui sera spécifique à la mise en œuvre, et non quelque chose que vous devriez compter sur.

Edit: Bien sûr, si vous utilisez le haut ou la limite dans la sous-requête, vous doit utiliser la commande. Mais ce n'est pas standard SQL de toute façon ...


0 commentaires

-4
votes

C'est totalement légitime. C'est à dire. Sélectionnez ID des entrées où l'auteur_Id dans (Sélectionnez ID de l'ordre des auteurs par nom de nom) Mais vous obtiendrez vraiment les mêmes résultats.


4 commentaires

D'habitude? Pouvez-vous donner un cas où les résultats diffèrent-ils?


Il diffère si vous ajoutez une déclaration de limite à votre sous-sélection. Dans ce cas, si vous souhaitez voir toutes les entrées des 5 meilleurs auteurs par nom, vous modifiez votre sous-sélection vers (Sélectionnez ID de l'ordre des auteurs par noms de la limite 5).


Vrai. Avec le haut / la limite, cela fait une différence (et est nécessaire, parfois même requis). Sinon, cela ne fait pas une différence.


Veuillez noter que mysql ne prend pas en charge ordre par ... limite dans le dans sous-requêtes.



3
votes

sauf si vous n'utilisez pas le haut, il n'est pas utile car vous commandera de toute façon dans la requête extérieure de toute façon


0 commentaires

1
votes

Aucun ordre par est valide dans une sous-requête Lorsque vous êtes intéressé par un sous-ensemble de données globales, vous avez donc toujours besoin d'un haut (SQL Server). Il ne sert à rien d'avoir une commande par sans top dans une sous-requête car la commande globale des résultats est traitée par la requête extérieure.


0 commentaires

1
votes

Vous ne devez pas l'utiliser. Selon l'art de SQL ', cela empêche effectivement l'optimiseur d'effectuer diverses optimisations qu'elle pourrait autrement faire car cela transforme pré-maturel.


0 commentaires

2
votes

Les gens plus intelligents disent que ce n'est pas un moyen propre / valide de le faire. Dans mon cas, sélectionnez Top 100% en sous-requête résolvée le problème.

acclamations


0 commentaires