整容说文库 > 程序代码 > 教育资讯

求一个触发器

来源:学生作业帮助网 编辑:整容说文库 时间:2019/06/25 19:45:14 程序代码
求一个触发器程序代码
有两张表 
1、学生表 A
2、成绩表 B

A表结构: id(学生ID)  name(学生姓名)  allperformance(总成绩)
            0001             张三               0

B表结构: id(学生ID)  subject(学科)   performance(成绩)
            0001             语文             80
            0001             数学             90
            0001             英语             70

当我保存B表时,B表的成绩列将合计后填入A表的总成绩中
请问这个触发器将如何实现,求实例!

create trigger b_tri on b
for insert,update,delete
as
if exists (select 1 from deleted)
update a
set a.allperformance = sum(b.performance)
from a join b on a.id = b.id 
       join deleted c on b.id = c.id
else
begin
insert into a
select b.id,姓名关联字段,sum(b.performance) 
from b join inserted c on b.id = c.id
where not exists (select 1 from a where id = c.id)

update a
set a.allperformance = sum(b.performance)
from a join b on a.id = b.id 
       join inserted c on b.id = c.id
end

go
if OBJECT_ID('tri_tracy') is not null
drop trigger tri_tracy
go
create trigger tri_tracy 
on B 
for insert,update,delete 
as 
if exists (select 1 from deleted) --如果是删除或者修改
update A set A.allperformance = sum(B.performance) 
from A join B on A.id = B.id join deleted D on B.id = D.id 
else 
begin 
insert into A select B.id,姓名关联字段,
sum(B.performance) from B join inserted I on B.id = I.id 
where not exists (select 1 from A where id = I.id) 
update A set A.allperformance = sum(B.performance) 
from A join B on A.id = B.id 
join inserted I on B.id =I.id 
end 
引用 1 楼 acherat 的回复:
SQL code

create trigger b_tri on b
for insert,update,delete
as
if exists (select 1 from deleted)
update a
set a.allperformance = sum(b.performance)
from a join b on a.id = b.id 
       join ……


消息 157,级别 15,状态 1,第 6 行
聚合不应出现在 UPDATE 语句的集合列表中。
消息 157,级别 15,状态 1,第 16 行
聚合不应出现在 UPDATE 语句的集合列表中。

create table taba
(id varchar(6), name varchar(8), allperformance int)

insert into taba
select '0001', '张三', 0

create table tabb
(id varchar(6), subject varchar(8), performance int)

-- 建触发器
create trigger tr_tabb on tabb
after update,insert,delete
as
begin
 with t as
 ( select id,sum(performance) s
   from tabb
   group by id
 )
 merge taba as a
 using t on a.id=t.id
 when matched then
   update set a.allperformance=t.s
 when not matched then
   insert(id,allperformance)
   values(t.id,t.s);
end

insert into tabb
select '0001', '语文', 80 union all
select '0001', '数学', 90 union all
select '0001', '英语', 70


select * from taba

id     name     allperformance
------ -------- --------------
0001   张三       240


select * from tabb

id     subject  performance
------ -------- -----------
0001   语文       80
0001   数学       90
0001   英语       70
程序代码