0

我正在尝试从其他表中其他表中列的平均值的表中进行选择;架构如下。

学生( sid, firstname, l astname, status, gpa, email)

注册( sid, classid, lgrade)

成绩( lgrade, ngrade)

错误的查询是,

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;
4

3 回答 3

1

从子查询中取出分号。

于 2013-04-08T23:45:46.893 回答
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已经确保它不会为空。

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

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;

事实上,我怀疑以这种方式简单地重写查询将有助于揭示它的问题——在我看来,gradesandenrollments表可能需要另一个连接条件?

于 2013-04-09T00:34:26.473 回答
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;
于 2013-04-09T00:43:56.913 回答