Справка по SQL-запросу - возвращает строку в таблице, которая относится к другой строке таблицы с max (столбец) - PullRequest
0 голосов
/ 13 июня 2010

У меня есть две таблицы:

Table1 = Schools
    Columns: id(PK), state(nvchar(100)), schoolname

Table2 = Grades
    Columns: id(PK), id_schools(FK), Year, Reading, Writing...

Я хотел бы разработать запрос, чтобы найти название школы, которая имеет самую высокую оценку по чтению.

Пока у меня есть следующее и мне нужна помощь для заполнения пробелов:

SELECT Schools.schoolname, Grades.Reading
FROM Schools, Grades
WHERE Schools.id = (* need id_schools for max(Grades.Reading)*)

Ответы [ 3 ]

1 голос
/ 13 июня 2010

Вот как я могу решить эту проблему, не используя подзапрос:

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.Спасибо!

1 голос
/ 14 июня 2010
SELECT 
     Schools.schoolname, 
     Grades.Reading 
FROM 
     Schools INNER JOIN Grades on Schools.id = Grades.id_schools
WHERE 
     Grades.Reading = (SELECT MAX(Reading) from Grades)
0 голосов
/ 13 июня 2010

Это должно сделать это

select * from Schools as s
where s.id=(
select top(1) id_schools from grades as g
order by g.reading desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...