SQL表达式缺失错误

时间:2013-04-08 23:44:02

标签: sql oracle sqlplus

我试图从一个表中选择其他表中其他表的列的平均值;架构如下。

学生sidfirstname,l astnamestatusgpaemail)< / p>

注册sidclassidlgrade

成绩lgradengrade

错误的查询是,

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;

3 个答案:

答案 0 :(得分:1)

从子查询中取出分号。

答案 1 :(得分:1)

有几个问题:

  • 从子查询中删除分号。
  • 您正在尝试将相关子查询用作值表达式。那很好,但是你必须把它包在括号中才能这样做。我只看到一组括号,avg()函数的括号。
  • 您还错过了列上的别名。为了清楚地表达您的意图,您应该保持一致并始终使用别名。
  • 最后,某处需要GROUP BY子句。

总而言之,我认为聚合应该在括号内。

尝试:

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

其他说明:e.lgrade is not null不需要g.lgrade = e.lgrade,因为条件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; 已经确保它不会为空。

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

grades

事实上,我怀疑只是以这种方式重写查询将有助于揭示它的错误 - 它在我看来可能enrollments和{{1}}表需要另一个连接条件?

答案 2 :(得分:0)

没有INNER JOIN的两个sub-queries - 请尝试。

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;