我有以下表结构
| 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 :(得分: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。
答案 1 :(得分: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
所以你可以在插入和删除行后调用它。但如果您的计数字段仅取决于您的桌子,我建议制作一个会重新计算您的值的触发器