2012-03-08 140 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 2012-03-08 02:26:02

回答

2

它总是一个更好的做法,只要有可能的话就得到一次值并随后使用它。你的情况,你总是可以使用内部查询,以获得数只有一次,计算等(衍生)列了它的值,如下图所示:

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,我认为这是不好的多次计数。 – 2012-03-08 00:25:09

0

简单的将是这样:

SELECT事件ID,次数(不同CompetitorID)AS NumberRunners, CASE WHEN计数(不同CompetitorID)< 5 THEN 1 当计(不同CompetitorID)> = 5和COUNT(DISTINCT CompetitorID)< = 7 THEN 2 ELSE 3 END AS NumberPlacings FROM谱曲 GROUP BY EventID Order By EventID;