我试图从一个表中选择其他表中其他表的列的平均值;架构如下。
学生(sid
,firstname
,l astname
,status
,gpa
,email
)< / p>
注册(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;
答案 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;