SQL表达式缺少错误

SQL表达式缺少错误,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我试图从一个表中选择,该表包含其他表中其他表的平均列数;模式如下 学生sid、名字、姓氏、状态、gpa、电子邮件 注册sid、classid、lgrade 等级L级,N级 而错误的质疑是, select sid, lastname, avg( select g.ngrade from grades g, enrollments e where e.sid = sid and g.lgrade = e.lgrade and e.lgrade is not null and g

我试图从一个表中选择,该表包含其他表中其他表的平均列数;模式如下

学生sid、名字、姓氏、状态、gpa、电子邮件

注册sid、classid、lgrade

等级L级,N级

而错误的质疑是,

select sid, lastname, 
avg( select g.ngrade from grades g, enrollments e 
    where e.sid = sid and g.lgrade = e.lgrade and e.lgrade is not null 
    and g.ngrade is not null) as cgpa
from students
order by cgpa asc;

将分号从子查询中去掉。

有几个问题:

从子查询中删除分号。 您正在尝试将相关子查询用作值表达式。那很好,但是你必须用括号括起来才能这样做。我只看到一组括号,用于avg函数。 列上还缺少别名。为了清晰地表达您的意图,您应该始终保持一致并使用别名。 最后,某个地方需要GROUPBY子句。 总而言之,我认为聚合应该在括号内

尝试:

其他注意事项:不需要e.lgrade is not null,因为条件g.lgrade=e.lgrade已经确保它不会为null

最后,我鼓励您学习ANSI join语法。以后你会感谢我的。说真的,使用旧式联接很糟糕

select
   s.sid,
   s.lastname, 
   (
      select avg(g.ngrade)
      from
         grades g
         inner join enrollments e
            on g.lgrade = e.lgrade
      where
         g.ngrade is not null
         and s.sid = g.sid
   ) as cgpa
from students s
order by cgpa asc;
事实上,我怀疑以这种方式简单地重写查询将有助于揭示问题所在。在我看来,可能成绩表和注册表需要另一个联接条件?

两个没有子查询的内部联接-请尝试

SELECT s.sid, s.lastname, avg(g.ngrade) cgpa
FROM Students s
JOIN Enrollments e ON s.sid = e.sid
JOIN Grades g ON e.lgrade=g.lgrade
GROUP BY s.sid, s.lastname
ORDER BY 3;

我得到的错误是EXPRESION丢失…在第2行,将平均值放在子查询中不是更好吗?选择sid,lastname,选择avgg.ngrade from。。。这会给我该列中所有值的平均值吗,或者结果是一列中有许多元组?我在这里无法想象。是的,这是有效的,但结果是错误的,这意味着问题在于where子句。我来查一查!谢谢考虑将子查询放在由SID分组并与学生连接的错误子句中,错误仍然存在,没有分号,第2行错误:ORA-900936:缺少表达式。半冒号已从帖子中删除。在第二个查询中的G级之后删除。在您的表达式中,E.SID=E.SID的目的是什么?是S.SID,您的小组中没有s.cid,请通过声明。@Azmi Kamis-谢谢。固定的
SELECT s.sid, s.lastname, avg(g.ngrade) cgpa
FROM Students s
JOIN Enrollments e ON s.sid = e.sid
JOIN Grades g ON e.lgrade=g.lgrade
GROUP BY s.sid, s.lastname
ORDER BY 3;