3

我有一个这样的 SQL 查询:

SET @q =
(SELECT Id AS '@Id', COUNT(Occ) AS '@Occ' FROM Details 
 GROUP BY Id
 ORDER BY COUNT(Occ) DESC, Id ASC
 FOR XML PATH('Data'), ROOT('Stats'), ELEMENTS, TYPE)

我正在设置 AS @Id 和 AS @Occ,以便我的 FOR XML 指令将输出转换为属性而不是元素。

我的问题:在 SELECT 和 ORDER BY 中两次出现 COUNT(Occ) 是否会导致计数被执行两次,如果是这样,我该如何防止这种情况发生?

谢谢!

4

3 回答 3

5

旧版本的 SQL 要求出现在ORDER BY子句中的任何表达式必须与子句中的列之一完全相同SELECT。这样就不必对表达式进行两次评估。只要您在两个地方都有完全相同的表达式,就不必执行两次。

事实上,您的排序可以写成ORDER BY 2 DESC, 1因为您可以只使用从 1 开始的列号,而不必复制表达式。无论您使用哪种方式,表达式都不应执行两次。

于 2010-12-05T06:50:40.187 回答
0

通过查看执行计划,您可以准确了解 SQL 是如何执行查询的。它可能不会计算两次,但这可能取决于优化器是否认为这样会更有效。在那种情况下,无论如何我都不会试图阻止它。

于 2010-12-05T06:42:26.650 回答
0

在“Bad Old Days”(SQL-86)中,您将不得不使用“ ORDER BY 2 DESC, 1 ASC”,指定您想要对数据进行排序的列号。这很 icky,所以以后的版本允许你指定相关的表达式来排序。但是优化器仍然不会第二次重新计算实际值。它必须知道计算的值才能进行排序(不要忘记,它可能需要在排序时多次将给定输出行的值与其他输出行的值进行比较)。

于 2010-12-05T06:50:09.260 回答