编写查询以找到在软件工程中得分最高的学生的姓名。根据名称对结果进行排序。
这就是我尝试过的。
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;
答案 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_name
是subject
的一列,与学生与标记的关系无关。因此,在确定分数最高的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_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;
答案 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;