2016-05-24 144 views
2

我有一個關於觸發器的問題。平均SQL觸發器

比方說,我有兩個表,一個叫「studentData」和其他「studentStanding」

'studentData'是由teacherID,studentID和rating組成的表格。 所以不同的老師可能對一個學生給予不同的評價

(例如:teacherID:1給出了評價:5 studentID:3和teacherID:7給出的評價:10〜studentID:3)

studentStanding是由studentID,studentName和averageRating組成的表格。

我的意圖是創建一個TRIGGER;

每當一位新老師(例如teacherID:120)給出評級至studentID: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嗨,對不起,我忘了在'studentStanding'中添加studentID – 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