2012-03-08 16 views
1

私はあなたが見る通り、Count(CompetitorID)が複数回呼び出されます。これはパフォーマンス上の問題ですか、またはSQL Server 2008のキャッシュはCountですか?これがパフォーマンス上の問題であれば、複数のルックアップを防ぐためにCountを保存することは可能ですか?SELECTクエリでCOUNTが重複しないようにする

SELECT EventID,Count(CompetitorID) AS NumberRunners, 
    CASE WHEN Count(CompetitorID)<5 THEN 1 
     WHEN Count(CompetitorID)>=5 AND Count(CompetitorID)<=7 THEN 2 
     ELSE 3 END AS NumberPlacings 
FROM Comps 
GROUP BY EventID Order By EventID; 
+0

構文では、操作を繰り返しているように見えますが、クエリアナライザはその操作を最適化する可能性があります。 – HABO

答えて

2

値を一度取得し、できるだけそれを使用することは、常により良い方法です。あなたのケースでは、あなたは常に一度だけカウントを取得し、以下に示すように、その値から外れ、他の(派生)の列を計算するために内部クエリを使用することができます。

SELECTイベントID、カウント:

SELECT EventID, NumberRunners, 
     CASE WHEN NumberRunners <5 THEN 1 
      WHEN NumberRunners >=5 AND NumberRunners <=7 THEN 2 
      ELSE 3 
     END AS NumberPlacings 
    FROM (
      SELECT EventID, 
        NumberRunners = Count(CompetitorID) 
       FROM Comps 
      GROUP BY EventID 
     ) t 
Order By EventID; 
+0

ありがとうAkhil、私はそれが何回も数えることは良くないと思った。 –

0

最も簡単なのは、このことだろうNumberRunners AS(別個CompetitorID)、 CASE数(別個CompetitorID)< 5 THEN 1 数(別個CompetitorID)> = 5カウント(別個CompetitorID)コンプ FROM NumberPlacings AS < = 7 THEN 2 ELSE 3 ENDイベントID順のGROUP BYのイベントID。

関連する問題