Подзапрос SQL Oracle - PullRequest
       7

Подзапрос SQL Oracle

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

Мне нужно создать подзапрос, в котором будут указаны student_id, student_first_name, module_name и оценка по математике (предмет «Математика») для студентов, которые имеют наивысшую оценку по каждому модулю. Таблица учеников связана с таблицей оценок с помощью student_id, а имя модуля, оценка и предмет сохраняются в таблице оценок. Но то, что у меня есть, кажется неправильным

SELECT S.STUDENT_ID, S.LAST_NAME, G.SECTION_ID, G.MODULE_NAME, G.GRADE
FROM STUDENT S, GRADE G
WHERE S.STUDENT_ID = G.STUDENT_ID
AND G.GRADE IN (SELECT MAX(GRADE) FROM GRADE G WHERE G.Subject = 'Maths')

Ответы [ 2 ]

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

Для этого не нужно использовать подзапрос. Одним из решений является аналитические функции:

SELECT SG.STUDENT_ID, SG.LAST_NAME, SG.SECTION_ID, SG.MODULE_NAME, SG.GRADE
FROM (SELECT S.STUDENT_ID, S.LAST_NAME, G.SECTION_ID, G.MODULE_NAME, G.GRADE,
             MAX(G.GRADE) OVER (PARTITION BY MODULE_NAME) as MAX_GRADE
      FROM STUDENT S JOIN
           GRADE G
           ON S.STUDENT_ID = G.STUDENT_ID
      WHERE G.Subject = 'Maths'
     ) sg
WHERE GRADE = MAX_GRADE;
0 голосов
/ 13 января 2019

Попробуйте следующий запрос

SELECT S.STUDENT_ID, S.LAST_NAME, G.SECTION_ID, G.MODULE_NAME, G.GRADE
FROM STUDENT S
JOIN GRADE G ON S.STUDENT_ID = G.STUDENT_ID
JOIN (
    SELECT G.MODULE_NAME, MAX(G.GRADE) max_grade
    FROM GRADE G 
    WHERE G.Subject = 'Maths'
    GROUP BY G.MODULE_NAME
) t ON G.MODULE_NAME = t.MODULE_NAME and
       G.GRADE = t.max_grade and
       G.Subject = 'Maths'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...