我有这些关系:
COURSE(COURSEID,SUBJECT)
LESSON(COUSEID,PRESENTSTUDENTS,DATE)
我必须在课程中选择具有当前学生平均分数的课程 我试着用:
SELECT COURSEINFO.AVERAGESTUDENTS
FROM (SELECT COURSE.COURSEID,AVG(PRESENTSTUDENTS) AVERAGESTUDENTS
FROM LESSON,COURSE
WHERE LESSON.COURSEID=COURSE.COURSEID
GROUP BY COURSE.COURSEID) COURSEINFO
WHERE COURSEINFO.AVERAGESTUDENTS = (SELECT MAX(M.AVERAGESTUDENTS)
FROM COURSEINFO M) /*(1)*/
但SQL Developer告诉我COURSEINFO
在我评论过(1)时不存在。我的问题是:我可以在我评论的FROM子句(COURSEINFO
)中使用我在外部查询中派生的表吗?派生表的可见性限制是多少?是否有“范围”的概念?
答案 0 :(得分:0)
看起来你正在做的就是获得最大平均值。
这应该做:
select max(avg(presentstudents))
from lesson l
join course c on l.courseid = c.courseid
group by c.courseid
答案 1 :(得分:0)
Gurwinder的答案是一个解决方案,因为使用FETCH FIRST ROW ONLY
或分析函数的解决方案。所有这些答案都“更好”,因为它们更简洁,并产生更好的执行计划。
但是考虑到你的约束,使用CTE而不是子查询:
WITH COURSEINFO AS (
SELECT C.COURSEID, AVG(L.PRESENTSTUDENTS) as AVERAGESTUDENTS
FROM LESSON L JOIN
COURSE C
ON L.COURSEID = C.COURSEID
GROUP BY C.COURSEID
)
SELECT ci.AVERAGESTUDENTS
FROM COURSEINFO ci
WHERE ci.AVERAGESTUDENTS = (SELECT MAX(M.AVERAGESTUDENTS)
FROM COURSEINFO ci2
) ;
另外,承诺永远不要在FROM
中使用逗号。在学习SQL时不要学习错误的语法。
答案 2 :(得分:0)
COURSEINFO这里不是一个表,而是一个给予子查询的别名
(SELECT COURSE.COURSEID,AVG(PRESENTSTUDENTS) AVERAGESTUDENTS
FROM LESSON,COURSE WHERE LESSON.COURSEID=COURSE.COURSEID
GROUP BY COURSE.COURSEID)
对于您的查询,其他子查询
(SELECT MAX(M.AVERAGESTUDENTS) FROM COURSEINFO M)
可能首先由编译器执行,它会抛出错误,因为没有像COURSEINFO这样的表。