#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
);