Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SELECT和ORDER BY中,计数是否执行两次?_Sql_Sql Server_Sqlxml - Fatal编程技术网

Sql 在SELECT和ORDER BY中,计数是否执行两次?

Sql 在SELECT和ORDER BY中,计数是否执行两次?,sql,sql-server,sqlxml,Sql,Sql Server,Sqlxml,我有这样一个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) 我将设置为@Id和@Occ,以便for-XML指令将输出转换为属性而不是元素 我的问题:SELECT和ORDER BY中计数(Occ)的双重

我有这样一个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)
我将设置为@Id和@Occ,以便for-XML指令将输出转换为属性而不是元素

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


谢谢

通过查看执行计划,您可以确切地看到SQL是如何执行查询的。它可能不会计数两次,但这可能取决于优化器是否认为这会更有效。在这种情况下,我不会试图阻止它。

在“糟糕的旧时光”(SQL-86)中,您必须使用“
按2 DESC,1 ASC排序”
”,指定要按其排序数据的列号。这很讨厌,所以以后的版本允许您指定要排序的相关表达式。但是优化器仍然不会再次重新计算实际值。它必须知道计算出的值才能进行排序(别忘了,在排序时,它可能需要将给定输出行的值与其他输出行的值进行多次比较).

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

事实上,您的排序可以写成
orderby2desc,1
,因为您可以只使用基于1的列编号,而不必复制表达式。无论使用哪种方式,表达式都不应执行两次