2016-05-24 8 views
2

トリガーに関する質問があります。平均のSQLトリガー

はのは、私は2つのテーブル、「studentData」およびその他の「studentStanding」と呼ばれるものを持っているとしましょう。

'studentData'は、teacherID、studentID、およびratingで構成される表です。 だから、別の教師が、単一の学生に

を異なる評価を与える可能性があり(例:teacherID:1評価できます:studentIDに5:3とteacherID:7評価を与える:studentIDへ10:3)

studentStandingは、studentID、studentNameおよびaverageRatingからなるテーブルです。

私はTRIGGERを作成しようとしています。

たびに新しい先生(例teacherID:120)はstudentIDに評価を与える:このTRIGGERは、この学生の平均評価を再計算します3、 3.

私はトリガーを書き込もうとしましたが、私はよ

それが完全に間違っていることを確かめる。

CREATE TRIGGER updateAVG 
AFTER INSERT ON studentData 
REFERENCING NEW AS N_ROW 
    FOR EACH ROW 
    UPDATE studentStanding SET Rating = (
     Select AVG(Rating) 
     from studentData 
    ) 

私は私を助けることができる誰にも楽しみにしている:ここで は、それがどのように見えるのです。私の引き金にも提案を入れてください。ありがとうございました。

注:これは学校の割り当てではありません。お約束します。

+0

「studentData」の「UPDATE」が実行されるのでしょうか、それとも常に「INSERT」になりますか? –

+0

私はちょうど問題を認識しました: 'studentData'はIDを使用しますが、' studentStanding'は名前を使用します。どのようにしてこれらのテーブルに参加できますか? –

+0

@TimBiegeleisenこんにちは、申し訳ありません。私はstudent studentに「studentStanding」を追加するのを忘れました – MasAdam

答えて

3
CREATE TRIGGER computeAvg 
AFTER INSERT ON studentData 
FOR EACH ROW 
    UPDATE studentStanding 
    SET averageRating = (SELECT AVG(rating) FROM studentData 
         WHERE studentStanding.studentID = studentData.studentID) 
    WHERE studentID = NEW.studentID; 
+0

海、入力していただきありがとうございます。ちなみに、最後のステートメント 'WHERE studentID = NEW.studentID'はstudentIDを参照していますか? studentData? – MasAdam

+0

これは 'studentStanding'テーブルの' studentID'を参照しています。この 'WHERE'条件は、単にINSERTによって影響を受けたレコードのみを更新することを意味します。これがなければ、トリガはテーブル全体(論理的に間違っているのではなく、非常に非効率的)でUPDATEを実行します。 –

+0

ありがとうございます。 – MasAdam