-1

ビューの作成 TRANSCRIPTVIEW が、コースを受講していない人の評点を 0 に設定する方法を理解するのに苦労しています。説明が役立ちます。解決策と質問は以下のとおりです。ありがとう。

Student(ID,Name) Transcript(StudId,CourseName,Semester,Grade)

SQL で次のクエリを作成します。すべての学生 (ID、名前) のリストを作成し、各学生について、S2002 学期に受講したコースの平均成績をリストします。S2002 でコースを受講しなかった学生がいる可能性があることに注意してください。これらの場合、平均成績は 0 としてリストされる必要があります。 解決策: 最初に、すべての学生を成績 0 の NULL コースに登録する行で TRANSCRIPT を拡張するビューを作成します。その学期の平均成績は 0 になります。

以下は私を混乱させるものです、これはどのように機能し、なぜ機能するのですか?

CREATE VIEW TRANSCRIPTVIEW AS (

( SELECT * FROM Transcipt)
UNION
( 
SELECT S.Id,NULL,’S2002’,0
FROM Student S)
WHERE S.Id NOT IN ( 
SELECT T.StudId
FROM Transcript T
WHERE T.Semester = ’S2002’) )
)

Remaining solution:
SELECT S.Id, S.Name, AVG(T.Grade)
FROM Student S, TRANSCRIPTVIEW T
WHERE S.Id = T.StudId AND T.Semester = ’S2002’ GROUP BY S.Id
4

2 に答える 2

1

how the create view, TRANSCRIPTVIEW, manages to set the grade of 0 for those who did not take a course

S2002 学期にコースを受講しなかった学生のセットは、その学期の成績証明書テーブルにレコードがありません。その学期にコースを受講した人は、その学期の表に記録があります。NULL, 'S2002',0学生が S2002 学期の Transcript テーブルにない場合、クエリは学生の値を提供します。

  SELECT S.Id,NULL,’S2002’,0 FROM Student S)    -- this parenthesis is wrong
  -- this following where conditions looks for students NOT IN the 2002 subset:
  WHERE S.Id NOT IN
   -- this next part gets a list of studentids for semester 2002
   (  
   SELECT T.StudId FROM Transcript T
    WHERE T.Semester = ’S2002’
   ) 
于 2013-03-22T18:04:14.587 に答える
0

あなたの質問の解決策はばかげています。より良い解決策は次のとおりです。

SELECT S.Id, S.Name, AVG(case when  T.Semester = ’S2002’ then T.Grade end) as AvgS2002Grade
FROM Student S left outer join
     TRANSCRIPTVIEW T
     on S.Id = T.StudId AND T.Semester = ’S2002’
GROUP BY S.Id

あなたの質問のクエリは非常に複雑です。すべての学生が含まれていることを確認するために、union(実際にunion allはパフォーマンス上の理由から)を使用しています。おやおや、これがleft outer join目的です。where条件付き集計の方が適している場合は、句でフィルタリングを行っています。ANSI 標準ではなく、古い結合構文を使用します。

これらの欠点で SQL を学習していないことを願っています。

于 2013-03-22T17:55:29.297 に答える