当某条数据的值在改变的时候,与之相关的有某些联系的一些数据也在同时改变。。例如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.   

    忘记说了,如果  2    a1     7      150
    这条信息改变,所有 name 包含 a1 的说有数据 value 都 增加  100*0.1
      deep = 7   的说有数据 value 都 增加  100*0.2每级别都是关联的。。比较麻烦。
      

  2.   

    if object_id('pubs..tb') is not null
       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 行)*/
      

  3.   

    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,那麼應該怎麼變化?
    這種情況是否會存在?
      

  4.   

    用触发器
    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
      

  5.   

    建个触发器试试
    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
      

  6.   

    我想是否能这样:
    在这个表上做个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注意:会不会造成死循环啊?
      

  7.   

    paoluo(一天到晚游泳的鱼) ( ) 信誉:100    Blog  2007-03-29 09:06:20  得分: 0  
     
     
       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,那麼應該怎麼變化?
    這種情況是否會存在?
      
     
      

  8.   

    to :paoluo(一天到晚游泳的鱼) 这个不是实际的问题,可能当时我也没想太好,不会出现死循环, 都是关联平级,或者是上级,不会出现死循环。。 看来需要用出发器了。,我想知道,触发器引起的变化,是否还能引起触发器的变化?
      

  9.   

    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.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
    */
      

  10.   

    --改用id做判斷,防止修改當前的紀錄。
    --另外,看數據,應該是要修改以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
    */