Par exemple, considérez la requête SQL:
SELECT
A.[Name],
ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
[FooTable] AS A
Ici, j'observe les résultats renvoyés triés par A. [Nom]. Si je change la colonne de tri définie dans la fonction ROW_NUMBER en une autre colonne, les résultats sont de nouveau triés par cette colonne.
Je m'attendais à ce que le numéro de ligne soit attribué aux lignes, mais je ne m'attendais pas à ce que les lignes reviennent triées selon les mêmes critères. Est-ce simplement un effet secondaire de la façon dont la requête est exécutée (dans mon cas sur SQL Server 2008 R2) ou ce comportement est-il garanti? (Je n'ai trouvé aucune référence à une telle garantie).
sql-server-2008-r2
order-by
redcalx
la source
la source
Réponses:
Si vous aviez posé la question, je pense que vous vouliez réellement vous poser:
Nous aurions pu vous dire de créer un alias pour l'
ROW_NUMBER()
expression, puis de trier à l'aide de l'alias:Il ne vous reste plus qu'à modifier l'expression au même endroit et le tri résultant sera basé sur cette expression sans avoir à la répéter.
la source
repeating the complex ORDER BY expression
cela ne garantit même pas que la sortie sortira par la commande ROW_NUMBER (). À moins que les colonnes de la clause ORDER BY ne forment une clé unique.Absolument pas. Preuve:
La seule façon de garantir une commande en SQL est de la demander, d'utiliser
ORDER BY
sur le résultat lui-même.la source
En fait, la (vieille) question pourrait être étendue pour inclure également la partition par partie, car il semble y avoir un ordre implicite d'abord la partition par , puis l' ordre par partie (s)
Il n'est donc pas aussi simple que certains l'ont suggéré d'assigner le numéro de ligne et de l'utiliser pour la commande.
Nous aurions également besoin d'un sql imbriqué extrayant la clause partition by (si nous ne voulons pas simplement la répéter bien sûr)
Empiriquement, nous semblons obtenir implicitement la dernière ligne de commande
Mais ce qui nous manque, c'est une preuve ou une garantie qu'il tient toujours.
(S'il y a plusieurs appels Row_Number () en jeu, c'est le DERNIER qui semble donner l'ordre)
NOTEZ AUSSI si vous ajoutez explicitement l' ordre par le plan d'exécution montre clairement une étape de tri finale, et le tri d'un ensemble déjà trié est en quelque sorte le pire des cas, donc cela prend beaucoup plus de temps avec l' ordre par que sans
la source