当某条数据的值在改变的时候,与之相关的有某些联系的一些数据也在同时改变。。例如id name deep value
1 a 9 50
2 a1 7 150
3 a2 8 250
4 b3 9 510
5 a4 3 501
6 a5 4 502
6 a6 5 503
7 b 6 503例如上表, 如果 id =1 的 value 从50---〉100name 包含 a 的说有数据 value 都 增加 100*0.1
deep = 9 的说有数据 value 都 增加 100*0.2怎么完成上面的操作,思路即可。。存储过程?出发器。还是在程序中判断? 因为要变动的数据可能比较多
1 a 9 50
2 a1 7 150
3 a2 8 250
4 b3 9 510
5 a4 3 501
6 a5 4 502
6 a6 5 503
7 b 6 503例如上表, 如果 id =1 的 value 从50---〉100name 包含 a 的说有数据 value 都 增加 100*0.1
deep = 9 的说有数据 value 都 增加 100*0.2怎么完成上面的操作,思路即可。。存储过程?出发器。还是在程序中判断? 因为要变动的数据可能比较多
这条信息改变,所有 name 包含 a1 的说有数据 value 都 增加 100*0.1
deep = 7 的说有数据 value 都 增加 100*0.2每级别都是关联的。。比较麻烦。
drop table tb
gocreate table tb(id int,name varchar(10),deep int,value decimal(18,2))
insert into tb(id,name,deep,value) values(1, 'a' , 9, 50)
insert into tb(id,name,deep,value) values(2, 'a1', 7, 150)
insert into tb(id,name,deep,value) values(3, 'a2', 8, 250)
insert into tb(id,name,deep,value) values(4, 'b3', 9, 510)
insert into tb(id,name,deep,value) values(5, 'a4', 3, 501)
insert into tb(id,name,deep,value) values(6, 'a5', 4, 502)
insert into tb(id,name,deep,value) values(6, 'a6', 5, 503)
insert into tb(id,name,deep,value) values(7, 'b' , 6, 503)
goupdate tb
set tb.value = tb.value + 100*0.1
from tb , (select * from tb where id = 1) t
where tb.name = t.name and tb.id <> 1update tb
set tb.value = tb.value + 100*0.2
from tb , (select * from tb where id = 1) t
where tb.deep = t.deep and tb.id <> 1select * from tb drop table tb/*
id name deep value
----------- ---------- ----------- --------------------
1 a 9 50.00
2 a1 7 150.00
3 a2 8 250.00
4 b3 9 530.00
5 a4 3 501.00
6 a5 4 502.00
6 a6 5 503.00
7 b 6 503.00(所影响的行数为 8 行)*/
如果1 a 9 50這一條變化了,
那麼2 a1 7 150,應該包含a,那麼這條會變化,
然後所有 name 包含 a1 的所有数据 value 都 增加 100*0.1
deep = 7 的所有数据 value 都 增加 100*0.2,
一直循環到沒有滿足條件的數據嗎?
2.
如果1 a 9 50這一條變化了,
某條數據name 包含a,deep = 9,那麼應該怎麼變化?
這種情況是否會存在?
create triger update_table on talbe
as
declare strsql varchar(100)
set strsql="update table set value=100*0.1 where name like '%" + INSERTED.name +"%'"
exec(strsql)
update table set value=100*0.2 where deep =INSERTED.deep
CREATE TRIGGER tritest
ON
AFTER UPDATE
AS
BEGIN
update tb set value=value*1.01 where charindex(inserted.name,'name')>0 and id<>inserted.id
update tb set value=value*1.02 where deep=insertd.deep and id<>inserted.id
END
在这个表上做个updated的触发器触发时,抽出被更新的记录 ,用这个记录中的值与更新之前的值比较,如果value50-->100
那么再用update tablexxx set vlaue=xxx*(1+0.1) where name=updated.name
update tablexxx set value=xxx*(1+0.2) where deep=updated.deep注意:会不会造成死循环啊?
1.
如果1 a 9 50這一條變化了,
那麼2 a1 7 150,應該包含a,那麼這條會變化,
然後所有 name 包含 a1 的所有数据 value 都 增加 100*0.1
deep = 7 的所有数据 value 都 增加 100*0.2,
一直循環到沒有滿足條件的數據嗎?
2.
如果1 a 9 50這一條變化了,
某條數據name 包含a,deep = 9,那麼應該怎麼變化?
這種情況是否會存在?
Insert TEST Values(1, 'a' , 9, 50)
Insert TEST Values(2, 'a1', 7, 150)
Insert TEST Values(3, 'a2', 8, 250)
Insert TEST Values(4, 'b3', 9, 510)
Insert TEST Values(5, 'a4', 3, 501)
Insert TEST Values(6, 'a5', 4, 502)
Insert TEST Values(6, 'a6', 5, 503)
Insert TEST Values(7, 'b' , 6, 503)
GO
Create Trigger UpdateValue On TEST
For Update
As
Begin
If Update(value)
Begin
Update TEST Set value = A.value * (1 + 0.1) From TEST A Inner Join Inserted B On A.name Like B.name + '%' And A.name != B.name
Update TEST Set value = A.value * (1 + 0.1) From TEST A Inner Join Inserted B On A.deep = B.deep And A.name != B.name
End
End
GO
Update TEST Set value = 100 Where id = 1Select * From TEST
GO
Drop Table TEST
/*
id name deep value
1 a 9 100.00
2 a1 7 165.00
3 a2 8 275.00
4 b3 9 561.00
5 a4 3 551.10
6 a5 4 552.20
6 a6 5 553.30
7 b 6 503.00
*/
--另外,看數據,應該是要修改以name + '%'的數據吧,如果是這樣的話,最好用Like name + '%' 做判斷,如果不是就改用 Like '%' + name + '%'或者charindex做判斷。Create Table TEST(id Int, name Varchar(10), deep Int, value Decimal(18,2))
Insert TEST Values(1, 'a' , 9, 50)
Insert TEST Values(2, 'a1', 7, 150)
Insert TEST Values(3, 'a2', 8, 250)
Insert TEST Values(4, 'b3', 9, 510)
Insert TEST Values(5, 'a4', 3, 501)
Insert TEST Values(6, 'a5', 4, 502)
Insert TEST Values(6, 'a6', 5, 503)
Insert TEST Values(7, 'b' , 6, 503)
GO
Create Trigger UpdateValue On TEST
For Update
As
Begin
If Update(value)
Begin
Update TEST Set value = A.value * (1 + 0.1) From TEST A Inner Join Inserted B On A.name Like B.name + '%' And A.id != B.id
Update TEST Set value = A.value * (1 + 0.1) From TEST A Inner Join Inserted B On A.deep = B.deep And A.id != B.id
End
End
GO
Update TEST Set value = 100 Where id = 1Select * From TEST
GO
Drop Table TEST
/*
id name deep value
1 a 9 100.00
2 a1 7 165.00
3 a2 8 275.00
4 b3 9 561.00
5 a4 3 551.10
6 a5 4 552.20
6 a6 5 553.30
7 b 6 503.00
*/