现在有表A:代号 父代号 名称 数量
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6现在想用触发器实现:
1.每当对数据进行增删改的时候,数据自动进行逐级汇总。
比如:当插入一条数据 代号 是001003 的时候,电焊 会自动汇总他下面的数量,如:001003的数量是2 则 电焊的数量应该是7.
2.表里的数据是变化的。就是希望当有数据进行操作时,各个父及会自动汇总,希望高手写的详细点。本人新手,谢了!!!
只要运行通过。马上结贴!!!
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6现在想用触发器实现:
1.每当对数据进行增删改的时候,数据自动进行逐级汇总。
比如:当插入一条数据 代号 是001003 的时候,电焊 会自动汇总他下面的数量,如:001003的数量是2 则 电焊的数量应该是7.
2.表里的数据是变化的。就是希望当有数据进行操作时,各个父及会自动汇总,希望高手写的详细点。本人新手,谢了!!!
只要运行通过。马上结贴!!!
insert into tb select '001','0','电焊',5
insert into tb select '001001','001','车工',2
insert into tb select '001002','001','机车',3
insert into tb select '002','0','汽车',5
insert into tb select '002001','002','坦克',5
insert into tb select '003','0','飞机',6
go
create trigger whereinsert
on tb
after insert
as
begin
update tb set 数量=b.数量+a.数量 from tb b inner join inserted a on b.代号=a.父代号
end
go
create trigger whereupdate
on tb
after update
as
begin
update tb set 数量=b.数量+a.数量-c.数量 from tb b inner join inserted a on b.代号=a.父代号 inner join deleted c on b.代号=c.父代号
end
go
create trigger wheredelete
on tb
after delete
as
begin
update tb set 数量=b.数量-c.数量 from tb b inner join deleted c on b.代号=c.父代号
end
go
insert into tb select '003001','003','喷气式客机',10
select * from tb
update tb set 数量=3 where 代号='003001'
select * from tb
delete from tb where 代号='003001'
select * from tb
go
drop table tb
/*
代号 父代号 名称 数量
-------------------- -------------------- -------------------- -----------
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 16
003001 003 喷气式客机 10(7 行受影响)(1 行受影响)
(1 行受影响)
代号 父代号 名称 数量
-------------------- -------------------- -------------------- -----------
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 9
003001 003 喷气式客机 3(7 行受影响)(0 行受影响)(1 行受影响)
(1 行受影响)
代号 父代号 名称 数量
-------------------- -------------------- -------------------- -----------
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6(6 行受影响)*/
if object_id('tb') is not null drop table tb
go
create table tb (代号 varchar(6),父代号 varchar(3),名称 varchar(4),数量 int)
insert into tb
select '001','0','电焊',5 union all
select '001001','001','车工',2 union all
select '001002','001','机车',3 union all
select '002','0','汽车',5 union all
select '002001','002','坦克',5 union all
select '003','0','飞机',6--UPDATE INSERTED,DELETED
--INSERT INSERTED
--DELETE DELETEDif object_id('gg') is not null drop trigger gg
go
create trigger gg on tb
for delete,update,insert -- 前触发AS--删除
IF NOT EXISTS(SELECT 1 FROM INSERTED)
update tb
set 数量=b.数量-D.数量
from ( select 父代号,sum(数量)数量 from deleted group by 父代号) D ,tb b
where D.父代号=b.代号
ELSE
--UPDATE
IF EXISTS(SELECT 1 FROM deleted)
update tb
set 数量=b.数量-D.数量+I.数量
from ( select 父代号,sum(数量)数量 from deleted group by 父代号) D ,
( select 父代号,sum(数量)数量 from INSERTED group by 父代号) I ,tb b
where d.父代号=b.代号 AND I.父代号=b.代号
--INSERT
ELSE
update tb
set 数量=b.数量+i.数量
from ( select 父代号,sum(数量)数量 from INSERTED group by 父代号) i ,tb b
where i.父代号=b.代号
GO --delete from tb where 代号='001002'
--select * from tb
/*
代号 父代号 名称 数量
------ ---- ---- -----------
001 0 电焊 2
001001 001 车工 2
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6(5 行受影响)
*/
--insert tb select '001003','001','dd车',3 --select * from tb/*
代号 父代号 名称 数量
------ ---- ---- -----------
001 0 电焊 8
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6
001003 001 dd车 3(7 行受影响)
*/update tb set 数量=5 where 代号='001002'
select * from tb代号 父代号 名称 数量
------ ---- ---- -----------
001 0 电焊 7
001001 001 车工 2
001002 001 机车 5
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6(6 行受影响)