2010-12-05 15 views
2

私はこのようなSQLクエリを持っている:SELECTとORDER BYにCOUNTが2回実行されますか?

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) 

私はXMLディレクティブは、属性の代わりの要素として出力を変換するためのために@IdとAS @Occ AS設定しています。

私の質問:SELECTとORDER BYの両方でCOUNT(Occ)が二重に発生すると、カウントが2回実行されますが、もしそうなら、どのようにしてこれを防止できますか?

ありがとうございます!

答えて

3

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

実際には、式をコピーする代わりに1から始まる列番号を使用できるので、並べ替えはORDER BY 2 DESC, 1と書くことができます。どのような方法で使用しても、式は2回実行されるべきではありません。

0

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

0

'Bad Old Days'(SQL-86)では、データを注文する列番号を指定して 'ORDER BY 2 DESC, 1 ASC'を使用しなければなりませんでした。これは非常に厄介なので、後のバージョンでは、関連する式を並べ替えて指定することができます。しかし、オプティマイザは、2回目に実際の値を再計算するつもりはありません。ソートを行うために計算された値を知っていなければなりません(また、ソートと同じように、ある出力行の値と他の出力行の値を何度も比較する必要があるかもしれません)。

関連する問題