SQL表达式缺少错误
我试图从一个表中选择,该表包含其他表中其他表的平均列数;模式如下 学生sid、名字、姓氏、状态、gpa、电子邮件 注册sid、classid、lgrade 等级L级,N级 而错误的质疑是,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
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;