Lorsque j'utilise un calcul ou une sous-requête dans ma clause ORDER qui se trouve déjà dans ma clause SELECT, SQL sait-il juste commander par cette colonne? Ou recalcule-t-il tout pour chaque ligne lors du tri?Est-ce que la clause Order By recalcule la valeur dans SQL Server?
Par exemple, permet de dire que j'écris une terrible requête comme ceci:
SELECT EmployeeName, (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
FROM Employee
ORDER BY (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
Ouais, je sais comment mieux écrire cette requête, et je sais comment utiliser ordinaux dans ma commande by-- mais si je ne le fais pas? Est-ce que SQL relance cette sous-requête pour chaque ligne, ou sait-elle qu'elle peut utiliser la valeur déjà dans la colonne 2?
Que diriez-vous de ORDERing sur une colonne qui utilise une fonction?
SELECT EmployeeName, LTRIM(RTRIM(BranchName)) FROM Employee
ORDER BY LTRIM(RTRIM(BranchName))
Est-ce que ça rétrimne ma colonne BranchName pour faire le tri? J'ai regardé quelques plans d'exécution et il semble ne pas ajouter de calcul, mais j'ai pensé que je trouverais si cela est vrai comme une généralité au lieu de mes cas spécifiques.
La raison principale que je demande est que lorsque vous faites une opération fenêtrée, comme ROWNUMBER() OVER(ORDER BY EmployeeID)
, je ne peux pas utiliser une référence ordinale pour le ORDER BY
. Donc, si l'une de mes colonnes est complexe, je discute parfois de la faire tomber dans une variable de table et ensuite de la trier à nouveau.
Oui, il semble que l'ajout à lui, mais si je alias le champ, il n'a pas besoin de re-scanner la table. MS doit ajouter un support d'alias dans le composant OVER windowed! –