SQL Server递归查询以反向工程

时间:2016-04-16 06:30:16

标签: sql-server common-table-expression

您好我需要编写一个查询来填充下表中的CurrentQuantity字段。我本来想使用while循环,但我想知道是否有办法编写递归查询来实现这一点。

基本上,currentQuantity是当前记录的下一个可用currentQuantity + QuantityChanged。因此在这种情况下,ID -11的currentQuantity是ID20的CurrentQuantity,它是当前记录的-45 + QuantityChanged,它是(-5 * -1),因此它变为-40。

ID列始终是递增的,因此我们可以对此做出假设。

我一直在尝试使用CTE编写递归查询,但不确定从哪里开始......任何帮助都将受到高度赞赏!

enter image description here

1 个答案:

答案 0 :(得分:0)

不太好,因为您的数据并不真正相关。尽管如此管理 - 示例代码:

create table #data (id int, currentQuantity int, quantityChanged int);

insert into #data values (-30, NULL, -10);
insert into #data values (-24, NULL, -10);
insert into #data values (-22, NULL, -10);
insert into #data values (-11, NULL, -5);
insert into #data values (20, -45, -5);

select * from #data;

;with rcte as (
    select id, currentquantity, quantityChanged, 0 as Level
    from #data where id = 20
    union all
    select d.id, r.currentquantity + (d.quantityChanged * -1),
    d.quantityChanged, level + 1
    from #data d inner join rcte r on d.id < r.id
)
update #data
set currentQuantity = r.currentQuantity
from #data d
inner join rcte r
on d.id = r.id
inner join (
    select id, row_number() over (order by id desc) - 1 level
    from #data
) idl
on r.id = idl.id
and r.level = idl.level;

select * from #data;

那应该产生你想要的东西。

注意:如果您使用的是SQL Server&gt; 2008你也可以使用超前/滞后函数来做到这一点。