2013-08-01 88 views
0

我有以下表結構遞歸更新值

| id | parentID | count1 | 

    2  -1   1 
    3  2   1 
    4  2   0 
    5  3   1 
    6  5   0 

我增加計數值從我的源代碼,但我還需要在價值泡沫增幅高達每父ID直到父id爲-1。

例如。如果我將行ID#6上的count1增加1,則行ID#5將增加1,ID#3將增加1,並且ID#2將增加1.

行也會被刪除,並且相反就需要發生,基本上從每個父母中減去要刪除的行的值。

在此先感謝您的洞察力。

我正在使用SQL Server 2008和C#asp.net。

+0

你正在使用Linq-to-SQL? – ataravati

+0

我不是,只是使用SQLCommands – opdb

+0

我建議使用CTE來處理這個問題。 – tsells

回答

0

如果你真的想只更新數,你可以想寫的存儲過程可以這樣做:

create procedure usp_temp_update 
(
    @id int, 
    @value int = 1 
) 
as 
begin 
    with cte as (
     -- Take record 
     select t.id, t.parentid from temp as t where t.id = @id 
     union all 
     -- And all parents recursively 
     select t.id, t.parentid 
     from cte as c 
      inner join temp as t on t.id = c.parentid 
    ) 
    update temp set 
     cnt = cnt + @value 
    where id in (select id from cte) 
end 

SQL FIDDLE EXAMPLE

所以,你可以把它插入和刪除行之後。但是,如果你的計數字段只取決於你的表格,我會建議做一個觸發器,它將重新計算你的值

+0

非常優雅和易於使用,謝謝。 – opdb

0

你想使用遞歸的CTE這樣的:

with cte as (
     select id, id as parentid, 1 as level 
     from t 
     union all 
     select cte.id, t.parentid, cte.level + 1 
     from t join 
      cte 
      on t.id = cte.parentid 
     where cte.parentid <> -1 
    ) --select parentid from cte where id = 6 
update t 
    set count1 = count1 + 1 
    where id in (select parentid from cte where id = 6); 

這裏是SQL Fiddle