2014-04-27 66 views
1

我正在安排一種網球運動員數據庫,我想向每個國家的頂級得分球員展示。我有PlayersPlayersCountry這個球員是來自Country列和RatingRating列名爲Points這是球員得分總分數。SQL使用MAX和Distinct同時

由於每個國家有多名球員,我不知道如何向玩家顯示來自每個國家的最高分數。

我試過如下:

select 
    playerstbl.FirstName, playerstbl.Country, ratingtbl.Points 
from 
    playerstbl 
join 
    ratingtbl on playerstbl.PlayerId = ratingtbl.PlayerId 
where 
    ratingtbl.Points = (select MAX(ratingtbl.Points) 
         from ratingtbl 
         group by playerstbl.Country); 
+1

您正在使用哪個數據庫? –

+0

如果你有一張單人桌,玩家的ID,國家和等級,這將會更容易。 –

回答

2

下面的查詢是有點不直觀的方式來回答這個問題。它是標準的SQL雖然:

select p.FirstName, p.Country, r.Points 
from playerstbl p join 
    ratingtbl r 
    on p.PlayerId = r.PlayerId 
where not exists (select 1 
        from playerstbl p2 join 
         ratingtbl r2 
         on p2.PlayerId = r2.PlayerId 
        where p2.Country = p.Country and 
         r2.Points > r.Points 
       ); 

而且,這種結構往往表現最好。它得到了這個問題的答案:「讓我所有的球員在同一個國家沒有球員的情況下獲得更多積分。」這相當於獲得最大值。

爲您的查詢工作,你需要把該國變成子查詢:

select p.FirstName, p.Country, r.Points 
from playerstbl p join 
    ratingtbl r 
    on p.PlayerId = r.PlayerId 
where r.Points = (select MAX(r2.Points) 
        from playerstbl p2 join 
         ratingtbl r2 
         on p2.PlayerId = r2.PlayerI 
        where p2.Country = p.Country 
       ); 

子查詢的where條款指的是外部查詢。這被稱爲「相關子查詢」,是SQL中一個非常強大的構造。毫無疑問,您的原始查詢返回了一個錯誤,表示子查詢返回了多行。這個版本解決了這個問題。

+0

非常感謝!我的朋友非常感謝! :) – Villager

相關問題