Внутреннее соединение и подзапрос с тремя различными отношениями - PullRequest
0 голосов
/ 13 января 2019

Справочная информация : Покемон приветствовал свое 20-летие в 2016 году. Поскольку Pokemon Pikachu является самым знаковым Pokemon, клуб Moke планирует вручить одноразовую награду члену, который получил наибольшее количество Pikachu, отправив электронный ваучер по электронной почте.

Вопрос: Узнайте участника, который поймал наибольшее число Пикачу в 2016 году. Показать имя участника, идентификатор участника, номер пойманного Пикачу и адрес электронной почты , Использование подзапроса или подзапроса с внутренним соединением.

Связанные отношения: участие, PokemomParticipation и Member (ниже приведен снимок таблицы отношений. (Таблица была изменена для отображения результата, относящегося к запросу)

PokemomParticipation: Участие в Pokemon

Pokemom: Pokemon

Группа: Участник

Из базы данных видно, что участник, который набрал наибольшее количество Пикачу, имеет идентификатор участника, равный 10, и его зовут Маркус. Идентификатор покемона Пикачу равен 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      )

Изображение: НЕПРАВИЛЬНОЕ Решение Проблема с этим решением в том, что ничего не отображается.

Большое спасибо за вашу щедрую помощь! Я пытался исследовать в Интернете, но не смог понять смысл объяснения. Я все еще новичок в запросе SQL.

РЕДАКТИРОВАНИЕ (ПРАВИЛЬНЫЕ РЕШЕНИЯ) Правильное решение

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вас интересует именно строка, в которой NumCaught имеет максимальное значение
для PokemonName ='Pikachu', а не для максимального значения NumCaught в целом.
Поэтому измените последнее условие на это:

AND 
pp.NumCaught = (
  SELECT MAX(t.NumCaught) FROM PokemonParticipation t
  WHERE t.PokemonID = pk.PokemonID
)

См. Демоверсию

0 голосов
/ 13 января 2019

Ваши соединения верны, вы не получите результат, потому что SELECT MAX(NumCaught) FROM PokemonParticipation возвращает 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, если есть несколько пользователей с одинаковым старшим номером

...