编写查询以查找在软件工程中得分最高的学生的姓名。根据名称对结果进行排序

时间:2019-04-17 10:12:44

标签: oracle

编写查询以找到在软件工程中得分最高的学生的姓名。根据名称对结果进行排序。

这就是我尝试过的。

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

7 个答案:

答案 0 :(得分:0)

您需要在子查询而不是主查询中添加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;

答案 1 :(得分:0)

除了您使用过时的隐式逗号语法进行联接之外,您还在子查询中以错误的方式组合表的列。

subject_namesubject的一列,与学生与标记的关系无关。因此,在确定分数最高的student_id时,分数可以与主题分开加入。然后,我们可以使用这些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_rankrank

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;     

答案 2 :(得分:0)

您可以尝试使用此代码。它必须完美运行:

 select s.student_name
    from student s
    join mark m
    on s.student_id=m.student_id
    join subject s1
    on s1.subject_id=m.subject_id
    where m.value=(select max(m1.value) from mark m1 
                     join subject s2
                     on s2.subject_id=m1.subject_id
                     where lower(s2.subject_name)='software engineering'
    group by s2.subject_id)
    group by s.student_name
    order by s.student_name;

答案 3 :(得分:0)

select student_name
from student join mark using(student_id) join subject using(subject_id)
where subject_name = 'Software Engineering' 
and value = (select max(value)
            from mark join subject using (subject_id)
            where subject_name = 'Software Engineering')
order by student_name;

这是非常不言自明的解决方案。

答案 4 :(得分:0)

select student_name
from student s join mark m on s.student_id=m.student_id 
join subject sub on m.subject_id=sub.subject_id
where lower(sub.subject_name)='software engineering' and 
m.value = (select max(m1.value)
             from mark m1 join subject sub1 on m1.subject_id=sub1.subject_id
             where lower(sub1.subject_name)='software engineering')
order by student_name;

答案 5 :(得分:0)

选择学生姓名 来自学生 其中student_id在( 选择学生 ID 从马克 其中 value=(select max(value) from mark 其中subject_id=( 选择subject_id 从主题 其中下(subject_name)='软件工程' ) ) ) ) 按学生姓名排序;

答案 6 :(得分:0)

select student_name
from student
where student_id in 
(select student_id 
from subject join mark using(subject_id)
where value in
(select max(value)
from mark
group by student_id
having initcap(subject_name) = 'Software Engineering'))
order by student_name;