具有三种不同关系的内部联接和子查询

时间:2019-01-13 08:40:18

标签: sql subquery inner-join

背景:口袋妖怪在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

2 个答案:

答案 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