SQL同时使用MAX和Distinct

时间:2014-04-27 12:51:06

标签: sql max distinct

我安排了一个网球运动员数据库,我想展示每个国家的得分最高的球员。我的表Players包含一个名为Country的列,该列是播放器来自的Country,以及一个表Rating,其中包含一个名为Points的列,球员得分的总分数。

由于每个国家/地区都有多名玩家,因此我不知道如何向玩家展示每个国家/地区的最高分数。

我尝试了以下内容:

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 :(得分: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中非常强大的构造。毫无疑问,您的原始查询返回了一个错误,表示子查询返回了多行。这个版本解决了这个问题。