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)

FOR XML ディレクティブが出力を要素ではなく属性として変換するために、AS @Id と AS @Occ を設定しています。

私の質問: SELECT と ORDER BY の両方で COUNT(Occ) が 2 回出現すると、カウントが 2 回実行されますか?

ありがとう!

4

3 に答える 3

5

以前のバージョンの SQL では、句に現れる式はORDER BY句内の列の 1 つとまったく同じでなければならないという要件がありましたSELECT。これは、式を 2 回評価する必要がないようにするためです。両方の場所にまったく同じ式がある限り、2 回実行する必要はありません。

実際、ORDER BY 2 DESC, 1式をコピーする代わりに、1 から始まる列番号を使用できるため、並べ替えは次のように記述できます。どちらの方法を使用する場合でも、式を 2 回実行しないでください。

于 2010-12-05T06:50:40.187 に答える
0

実行計画を見ると、SQL がどのようにクエリを実行するかを正確に確認できます。おそらく 2 回カウントされることはありませんが、オプティマイザーがより効率的であると判断するかどうかによって異なります。その場合、私はとにかくそれを止めようとはしません。

于 2010-12-05T06:42:26.650 に答える
0

'Bad Old Days' (SQL-86) では、' ORDER BY 2 DESC, 1 ASC' を使用して、データを並べ替える列番号を指定する必要がありました。これはかなり面倒なので、新しいバージョンでは、関連する式を指定して並べ替えることができます。しかし、オプティマイザは実際の値を 2 回再計算することはまだありません。並べ替えを行うには、計算された値を知る必要があります (並べ替えを行うときに、特定の出力行の値を他の出力行の値と何度も比較する必要がある場合があることを忘れないでください)。

于 2010-12-05T06:50:09.260 に答える