我安排了一个网球运动员数据库,我想展示每个国家的得分最高的球员。我的表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);
答案 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中非常强大的构造。毫无疑问,您的原始查询返回了一个错误,表示子查询返回了多行。这个版本解决了这个问题。