SQL触发器更新平均值

时间:2015-06-07 22:20:23

标签: sql oracle triggers average


我在尝试在Oracle SQL上触发时遇到了很多麻烦...... 这是我的问题:
- 我有一个包含值0-10的表X和一个包含一组X ID的此值的平均值的表Y.所以我必须触发一个重新计算我正在插入删除或更新的ID的平均值 什么基本上我正在做和运气......:

CREATE or REPLACE trigger Update_Average
    after insert or update or delete on X

DECLARE 
    holdID X.ID%type;
    Avrg Y.Average%type;

BEGIN
    holdID := X.ID;

    select avg(value)
      into Avrg
      from X 
      where X.id = holdID;

    update Y
       set Average = Avrg
       where Y.id = holdID;

END;

1 个答案:

答案 0 :(得分:1)

我认为你可以做到:

begin
    update Y
        set average = (select avg(value) from x where x.id = :new.id)
        where y.id = :new.id;
end

编辑:

Oracle对于更新触发器中正在修改的表非常繁琐。就个人而言,我想通过在Y中存储两个值 - 总和和计数来避免这个问题。然后,触发器看起来像:

begin
    update Y
        set sum = (sum + (case when :new.id is not null then :new.value else 0 end) -
                   (case when :old.id is not null then :old.value else 0 end))
            cnt = (cnt + (case when :new.id is not null then 1 else 0 end) -
                   (case when :old.id is not null then 1 else 0 end))
        where y.id = :new.id;
end

注意:为了便于将其放在一个语句中,这将检查NULL的值,而不是使用if DELETING。我非常确定Oracle会在删除触发器中返回NULL之类的:NEW记录。