当我在我的 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)
是的,我知道如何更好地编写这个查询,并且我知道如何在我的 order by 中使用序数——但如果我不这样做呢?SQL 会为每一行重新运行这个子查询,还是知道它可以使用第 2 列中已经存在的值?
对使用函数的列进行排序怎么样?
SELECT EmployeeName, LTRIM(RTRIM(BranchName)) FROM Employee
ORDER BY LTRIM(RTRIM(BranchName))
它会重新修剪我的 BranchName 列来进行排序吗?
我查看了一些执行计划,它似乎没有添加任何计算,但我想我会发现这是否适用于一般性而不是我的具体情况。
我问的主要原因是在执行窗口操作时,例如ROWNUMBER() OVER(ORDER BY EmployeeID)
,我不能对ORDER BY
. 因此,如果我的某个列很复杂,我有时会争论将其转储到表变量中,然后再对其进行排序。