在SQL中的子查询中使用派生表

时间:2017-05-14 13:24:43

标签: sql oracle

我有这些关系:

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)中使用我在外部查询中派生的表吗?派生表的可见性限制是多少?是否有“范围”的概念?

3 个答案:

答案 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这样的表。