Напишите запрос, чтобы найти имя учащегося (учеников), набравшего максимальное количество баллов по программной инженерии. Сортировать результат по имени - PullRequest
0 голосов
/ 17 апреля 2019

Напишите запрос, чтобы найти имя учащегося (учеников), набравшего максимальное количество баллов по программной инженерии. Сортировать результат по имени.

Это то, что я пытался.

select s.student_name 
  from student s,mark m,subject su
  where s.student_id=m.student_id and su.subject_id=m.subject_id and max(m.value)in 
  (select value from mark where lower(su.subject_name)='software engineering')
   order by s.student_name;

Я не получаю правильный результат. This is the schema

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Помимо того, что вы используете устаревший неявный синтаксис запятой для объединений, вы также неправильно комбинируете столбцы таблиц в подзапросе.

subject_name - это столбец subject, который не имеет ничего общего с отношением студента к оценкам.Таким образом, оценка может быть объединена отдельно с предметом при определении максимальных оценок student_ids.Затем мы можем получить имя учащегося, используя эти student_ids

Итак, в Oracle 12c и выше вы можете сделать

SELECT s.student_name
   FROM student s
WHERE s.student_id IN ( SELECT m.student_id
                        FROM mark m JOIN subject su 
                         ON su.subject_id = m.subject_id
                        WHERE lower(su.subject_name) = 'software engineering'
                           ORDER BY m.value DESC
                        FETCH FIRST 1 ROWS WITH TIES ) order by 1;  

Для предыдущих версий вы можете использовать dense_rank или rank

SELECT s.student_name
   FROM student s
WHERE s.student_id IN ( SELECT student_id
                        FROM ( SELECT m.*,DENSE_RANK() OVER(
                                    ORDER BY m.value DESC
                               ) AS rnk
                               FROM mark m  JOIN subject su 
                                ON su.subject_id = m.subject_id
                        WHERE lower(su.subject_name) = 'software engineering'
                    ) WHERE rnk = 1
               ) order by 1;     
0 голосов
/ 17 апреля 2019

вам нужно добавить функцию max в подзапрос вместо основного запроса.

select s.student_name
  from student s, mark m, subject su
 where s.student_id = m.student_id
   and su.subject_id = m.subject_id
   and m.value in
       (select max(value)
          from mark
         where lower(su.subject_name) = 'software engineering')
 order by s.student_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...