日期:2014-05-19  浏览次数:20510 次

熟悉触发器的请近,一个有一点复杂的更新插入触发器
create   table   t1   (name   varchar(50),unit   varchar(50),class   varchar(50))
                                                                                        --   class   就只有3种(差,合格,优秀)
insert   t1
select   'a '   , '1班 ', '优秀 '   union   all
select   'a ', '1班 ', '合格 '   union   all
select   'a ', '1班 ', '较差 '   union   all
select   'a ', '2班 ', '优秀 'union   all
select   'a ', '2班 ', '优秀 'union   all
select   'a ', '2班 ',   '合格 '   union   all

select   'b '   , '1班 ', '优秀 '   union   all
select   'b ', '1班 ', '合格 '   union   all
select   'b ', '1班 ', '较差 '   union   all
select   'b ', '2班 ', '优秀 'union   all
select   'b ', '2班 ', '优秀 'union   all
select   'b ', '2班 ',   '合格 '  


表t2完全是根据表t1   得到的     以上会得到如下的t2   ,otherthing列除外

create   table   t2   (name   varchar(50),unit   varchar(50),较差   int   ,合格   int   ,优秀   int   ,otherthing   varchar(50))
  insert   t2
select   'a ', '1班 '   ,1,1,1, 'wwfefaafaf '   union   all
select   'a ', '2班 ',0,1,2   , 'fdasfdasfd '   union   all
select   'b ', '1班 '   ,1,1,1, 'wwewew '   union   all
select   'b ', '2班 ',0,1,2   , 'eeeeee '  


在表t1上定义个触发器,想得到一个汇总更新插入   在t2表也同时变化
比如   更新   t1的第一行数据     ,t2会相应的变化
          在t1插入     'a '   , '1班 ', '较差 '     ,t2会有变化
        在t1中插入     'c '   , '4班 ', '较差 '     ,t2会有增加一条   'c '   , '4班 ',1,0,0   ,null的行  

这样的触发器有点复杂   不过理解起来不难


------解决方案--------------------
create table t1 (name varchar(10),unit varchar(10),class varchar(10))
create table t2 (name varchar(10),unit varchar(10),较差 int ,合格 int ,优秀 int ,otherthing varchar(10))
go
create trigger tr_t1 on t1
for update,delete,insert
as
begin

insert t2(name,unit,较差,合格,优秀)
select distinct name,unit,0,0,0 from inserted _i
where not exists(select 1 from t2 where _i.name = name and _i.unit = unit)

update t2
set t2.较差 = t2.较差 + (select count(1) from inserted where name = t2.name and unit = t2.unit and class = '较差 ')
,t2.合格 = t2.合格 + (select count(1) from inserted where name = t2.name and unit = t2.unit and class = '合格 ')
,t2.优秀 = t2.优秀 + (select count(1) from inserted where name = t2.name and unit = t2.unit and class = '优秀 ')

update t2
set t2.较差 = t2.较差 - (select count(1) from deleted where name = t2.name and unit