すでにSELECT句にあるORDER句で計算またはサブクエリを使用すると、SQLはその列で並べ替えることを認識しますか?または、並べ替え時に各行のすべてを再計算しますか?
たとえば、次のようなひどいクエリを書いているとしましょう。
SELECT EmployeeName, (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
FROM Employee
ORDER BY (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
うん、私はこのクエリをよりよく書く方法を知っています、そして私は私の順序で序数を使用する方法を知っています-しかし私がそうでない場合はどうなりますか?SQLは行ごとにこのサブクエリを再実行しますか、それとも列2にすでにある値を使用できることを知っていますか?
関数を使用する列のORDERはどうですか?
SELECT EmployeeName, LTRIM(RTRIM(BranchName)) FROM Employee
ORDER BY LTRIM(RTRIM(BranchName))
並べ替えを行うためにBranchName列をリトリムしますか?
いくつかの実行プランを調べたところ、計算が追加されていないようですが、これが私の特定のケースではなく、一般性として当てはまるかどうかを確認したいと思いました。
私が尋ねる主な理由は、などのウィンドウ操作を実行するときにROWNUMBER() OVER(ORDER BY EmployeeID)
、の序数参照を使用できないことORDER BY
です。そのため、列の1つが複雑な場合は、それをテーブル変数にダンプしてから再度並べ替えることについて議論することがあります。