2012-09-05 186 views
0

假设你有如下表:SQL - 查询优化

TABLE Car 
car_id 
num 

TABLE Car_description 
dsc_id 
car_id 
model 

TABLE Result 
res_id 
car_id 
race_num 
result 

的任务是选择最多,平均得分,我们有超过2台车和Car.num,Car_description.model最佳汽车比赛。解决它的一种方法是编写以下查询。

select r.race_num, 
     MAX(score) as MaxScore, 
     AVG(score) as AvgScore, 
     MAX(case when seqnum = 1 then c.carnum end) as TopCarNum, 
     MAX(case when seqnum = 1 then cd.model end) as TopCarModel 
from (select r.*, 
      ROW_NUMBER() over (partition by race_num order by score desc) as seqnum 
     from Result r 
    ) r left outer join 
    Car c 
    on c.car_id = r.car_id left outer join 
    Car_Description cd 
    on c.car_id = d.car_id 
group by r.race_num 
having COUNT(*) > 2 

但是,这里我们在内部查询中执行结果表的排序,而不是选择最大元素,我认为它会很耗时。是这样吗?我们如何优化这个?谢谢。

+5

“我认为这将是耗时”然后对其进行测试。 – deltree

回答

1

我不知道这是否可以在性能方面提供帮助,但尝试

SELECT r.race_num, 
    MAX(score) as MaxScore, 
    AVG(score) as AvgScore, 
    MAX(case when mr.max_score IS NOT NULL then c.carnum end) as TopCarNum, 
    MAX(case when mr.max_score IS NOT NULL then cd.model end) as TopCarModel 
FROM Result LEFT OUTER JOIN 
    (SELECT r.race_num, MAX(score) max_score FROM Result r GROUP BY r.race_num) mr 
    ON Result.res_num = mr.res_num AND Result.score = mr.max_score 
LEFT OUTER JOIN Car c 
ON c.car_id = Result.car_id 
LEFT OUTER JOIN Car_Description cd 
ON c.car_id = d.car_id 
GROUP BY r.race_num 
HAVING COUNT(*) > 2 
+0

没关系,你只能在内部选择中忘记分组。谢谢。 –

+0

对不起,没有测试,我只是修好了,谢谢。 – saul672