2017-05-14 9 views
0

でサブクエリで派生テーブルを使用する:私はこれらの関係を持っているSQL

COURSE(COURSEID,SUBJECT) 
LESSON(COUSEID,PRESENTSTUDENTS,DATE) 

私は私がしようレッスン の間に存在し、学生の最大平均を持っているCOURSEIDを選択する必要があります。

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

あなたがしているすべてのものが最大平均を取得しているように見えます。

これは、実行する必要があります。FETCH FIRST ROW ONLYまたは分析関数を使用して解決策になるよう

select max(avg(presentstudents)) 
from lesson l 
join course c on l.courseid = c.courseid 
group by c.courseid 
+0

ありがとう、私はそれを解決しました。しかし、私はまだ最初の試行でどこにエラーがあるのか​​分かりません。その時点でテーブルが表示されないので – Salvo

+0

@SalvoNice選択のためにfrom句で定義されたサブクエリを再度使用することはできません(CTEを使用してください)。しかし、あなたの問題はそれを必要としませんでした。 – GurV

0

Gurwinderの答えは、一つの解決策です。これらの回答はすべて、より簡潔でより良い実行計画を生むという意味で「より良い」ものです。

しかし、あなたの制約が与えられ、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を習得しているときに悪い構文を学ばないでください。ここ

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のような表がないのでエラーです。

関連する問題