2011-11-25 181 views
0

這是我的數據庫架構如何在主查詢使用聚合函數的子查詢

Horse(horseId, horseName, age, gender, registration, stableId) 
Owner(ownerId, lname, fname) 
Owns(horseId, ownerId) 
Stable(stableId, stableName, location, colors) 
Trainer(trainerId, lname, fname, stableId) 
Race(raceId, raceName, trackName, raceDate, raceTime) 
RaceResults(raceId, horseId, results, prize) 
Track(trackName, location, length) 

我想寫這作爲查詢:

對於每一個已經運行三年多種族坐騎,列表每匹馬的馬名,總獎金和比賽數量都會持續。列名應該是「馬名」,「贏」和「種族」。結果應按降序排序。

我寫這個子查詢作爲開頭:

SELECT horseid, COUNT(horseid) AS NumberOfRaces, SUM(prize) winnings 
FROM raceresults 
GROUP BY horseid 
HAVING COUNT(horseid) >3 

但我怎麼能使用在主查詢的聚集函數結果{NumberOfRaces和獎金}?

+1

這是一個家庭作業嗎? – Sparky

+0

你在你的示例SQL中非常接近,你應該可以用一個查詢來完成它,而不需要子查詢。查找JOIN獲取馬的名字和ORDER BY以獲得正確的排序 – Sparky

回答

0

使用子選擇器通過所需的鍵確定聚合值並將其內部連接回主表。我要僞代碼,讓你把它放在一起......看起來像是一項家庭作業。

Select id, sum(winnings) from table group by id 

這會產生一個id列表和他們的獲勝(任何聚合的概念相同,而不僅僅是這個總和)。你可以在這個級別有幾個聚合... id,總和(獎金),計數(獎金),平均(獎金)將在一個聲明中工作)。在它周圍放置一組括號並將其稱爲子查詢。加入這一回你原來的說法...

... 
from 
(select id, sum(winnings) as winnings) a 
inner join horse h on h.id = a.id 

現在,您可以參考小時。*或a.winnings作爲與該ID列。內部加入意味着沒有獎金的馬匹將被丟棄,左側加入將顯示所有獎金,無論獎金如何。