背景:口袋妖怪在2016年迎来了20周年纪念。 由于Pokemon皮卡丘是最具标志性的Pokemon,因此Moke俱乐部计划通过电子邮件发送电子凭单,为获得最多皮卡丘数量的会员颁发一次性奖励。
问题:找出在2016年抓到了皮卡丘次数最多的会员。显示会员名称,会员ID,抓到的皮卡丘人数和电子邮件地址。在内部联接中使用子查询或子查询。
涉及的关系:参与,PokemomParticipation和成员(下面是关系表的快照。(已修改表以显示与查询相关的结果)
Pokemom参与: PokemonParticipation
口袋妖怪: Pokemon
成员: Member
从数据库中,我们可以看到捕获最多皮卡丘数量的成员的memberID为10,其名称为Marcus。皮卡丘的口袋妖怪ID为10。因此,解决问题需要这三个关系。
我的回答(错误的解决方案):
USE MokeClub
GO
SELECT m.MemberID, m.Name, m.Email,pp.NumCaught
FROM Member m INNER JOIN PokemonParticipation pp
ON m.MemberID = pp.MemberID
INNER JOIN Pokemon pk
ON pp.PokemonID =pk.PokemonID
WHERE pp.DateCaught >'2015-Dec-31' AND pp.DateCaught <'2017-Jan-01' AND pk.PokemonName ='Pikachu'
AND
NumCaught = (SELECT MAX(NumCaught)
FROM PokemonParticipation )
图片:WRONG Solution 该解决方案的问题是什么也不显示。
非常感谢您的慷慨帮助! 我曾尝试在网络上进行研究,但无法从解释中获得某些含义。我仍然是SQL查询的初学者。
已编辑(正确的解决方案) Correct Solution
答案 0 :(得分:0)
您的联接是正确的,您没有得到结果,因为SELECT MAX(NumCaught) FROM PokemonParticipation
从其他Pokemons返回了13
。您需要添加其他条件来过滤皮卡丘,或者您只需切换到TOP:
SELECT TOP 1 WITH TIES
m.MemberID, m.Name, m.Email,pp.NumCaught
FROM Member m INNER JOIN PokemonParticipation pp
ON m.MemberID = pp.MemberID
INNER JOIN Pokemon pk
ON pp.PokemonID =pk.PokemonID
WHERE pp.DateCaught >'2015-Dec-31' -- i would prefer >= '2016-Jan-01' (just in case there's a time portion)
AND pp.DateCaught <'2017-Jan-01'
AND pk.PokemonName ='Pikachu'
ORDER BY pp.NumCaught DESC
如果有多个用户具有相同的高号码,我正在使用WITH TIES
答案 1 :(得分:0)
您对NumCaught
具有最大值的行特别感兴趣
通常是PokemonName ='Pikachu'
的最大值,而不是NumCaught
的最大值。
因此,将最后一个条件更改为此:
AND
pp.NumCaught = (
SELECT MAX(t.NumCaught) FROM PokemonParticipation t
WHERE t.PokemonID = pk.PokemonID
)
请参见demo