Найдите самого младшего в каждой команде в базе данных

#sql #subquery #operators #multiple-columns #clause

#sql #подзапрос #операторы #несколько столбцов #предложение

Вопрос:

У меня есть таблица игроков и таблица команд, и я пытаюсь найти самого молодого игрока в каждой команде. Я могу найти самого молодого игрока:

 SELECT lname, fname, dob, position
FROM players 
WHERE dob = (SELECT MAX(dob) FROM players);
 

Когда я пытаюсь включить таблицу команд, я получаю те же данные, что и выше, что и самый молодой игрок в целом. Я очень новичок в этом, поэтому я все еще пытаюсь понять подзапросы с несколькими строками. Если я сделаю заказ по названию команды, я получу тот же результат. Нужен ли мне еще один оператор SELECT для таблицы teams? Как бы я это сделал, если да? Изменение оператора с IN на ALL или ANY также даст мне тот же результат.

 SELECT lname, fname, dob, position, name
FROM players p JOIN teams t ON p.team_id = t.id
WHERE dob IN (SELECT MAX(dob) FROM players);
 

Я работаю в LiveSQL, если это поможет.

Ответ №1:

Вам даже не нужна таблица команд, чтобы просто получить информацию об игроке. Достаточно коррелированного подзапроса:

 SELECT p.lname, p.fname, p.dob, p.position
FROM players p
WHERE p.dob = (SELECT MAX(p2.dob)
               FROM players p2
               WHERE p2.team_id = p.team_id
              );
 

Вы можете ввести a JOIN , чтобы получить название команды, если хотите:

 SELECT p.lname, p.fname, p.dob, p.position, t.name
FROM players p JOIN
     teams t
     ON p.team_id = t.id
WHERE p.dob = (SELECT MAX(p2.dob)
               FROM players p2
               WHERE p2.team_id = p.team_id
              );
 

Ответ №2:

Вы можете использовать NOT EXISTS следующим образом:

 SELECT LNAME, FNAME, DOB, POSITION, NAME
  FROM PLAYERS   P
  JOIN TEAMS     T
ON P.TEAM_ID = T.ID
 WHERE NOT EXISTS (
    SELECT 1
      FROM PLAYERS P1
    WHERE P1.TEAM_ID = P.TEAM_ID
      AND P1.DOB < P.DOB
);