Вот как я могу решить эту проблему, не используя подзапрос:
SELECT s.*
FROM Schools AS s
JOIN Grades AS g1 ON g1.id_schools = s.id
LEFT OUTER JOIN Grades AS g2 ON g2.id_schools <> s.id
AND g1.Reading < g2.Reading
WHERE g2.id_schools IS NULL
Обратите внимание, что вы можете получить более одной строки назад, если более одной школьной связи соответствует наибольшему количеству очков чтения.В этом случае вам необходимо решить, как разрешить привязку и встроить ее в условие LEFT OUTER JOIN.
Ваш комментарий: Левое внешнее соединение ищет строку с более высокой оценкой длятой же школы, и если ничего не найдено, все столбцы g2. * будут нулевыми.В этом случае мы знаем, что ни одна оценка не выше, чем оценка в строке, на которую указывает g1, что означает, что g1 является самой высокой оценкой для этой школы.Это также может быть написано так, что логически то же самое, но может быть легче понять:
SELECT s.*
FROM Schools AS s
JOIN Grades AS g1 ON g1.id_schools = s.id
WHERE NOT EXISTS (
SELECT * FROM Grades g2
WHERE g2.id_schools <> s.id AND g2.Reading > g1.Reading)
Вы говорите, что это не работает.Можете быть более конкретными?Какой ответ вы ожидаете, и что на самом деле происходит, и чем они отличаются?
edit: Изменено =
на <>
согласно предложению в комментарии @potatopeelings.Спасибо!