基于父ID SQL Server的行递归更新值

时间:2013-08-01 23:30:30

标签: c# asp.net sql-server sql-server-2008 recursion

我有以下表结构

| 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。

2 个答案:

答案 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

SQL FIDDLE EXAMPLE

所以你可以在插入和删除行后调用它。但如果您的计数字段仅取决于您的桌子,我建议制作一个会重新计算您的值的触发器