如何修复此Sql代码,以便在KEEN教授的课程中用灰色给出比最高成绩更好的成绩的学生及其等级的名称

时间:2019-04-28 01:10:40

标签: oracle

我有4张桌子,分别是班级,学生,教师和年级。 我希望SQL列出在KEEN教授的课程中,其成绩比“灰色”最高分高的学生及其年级。

这是我所做的事情的一个示例

 SELECT S_NAME, GRADE
        FROM GRADE1
        WHERE GRADE >(SELECT GRADE FROM GRADE1 G
        INNER JOIN CLASS1 C ON G.C_NAME=C.C_NAME
        INNER JOIN aggarwal.FACULTY1 F ON F.F_NAME
        WHERE G.S_NAME='GRAY' AND F.F_NAME='KEEN');  
  

第6行出现错误:
  ORA-00920:关系运算符无效

有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

最后一个INNER JOIN是罪魁祸首;它的ON子句未包含应有的所有内容-您要加入F.F_NAME来做什么?

此外,还有其他一些反对意见:

  • 总是使用表别名,尤其是在使用子查询时,因为您可能会发现自己迷惑地得到了意想不到的结果
  • 子查询错过了MAX函数;一般而言,您应注意它返回单个值,否则将得到TOO-MANY-ROWS,除非您应用ALL(或ANY),例如

    where r.grade > any (select g.grade from grade1 g ...)
    
  • 您为什么在表名之前加上它的所有者,例如:aggarwal.FACULTY1?并非所有表都属于同一模式?如果是这样,请将其删除(或为了保持一致性,也将其与所有其他表一起使用)。

最后,您的查询可能如下所示:

select r.s_name, r.grade
from grade1 r                                            --> missing alias(es)
where r.grade > (select max(g.grade)                     --> missing MAX
                 from grade1 g
                 inner join class1 c on g.c_name = c.c_name
                 inner join faculty1 f on f.f_name = ... --> missing value here
                 where g.s_name = 'GRAY' 
                   and f.f_name = 'KEEN'
                );