2012-09-05 187 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