循环更新SQL存储过程

时间:2017-09-18 01:02:44

标签: sql sql-server

我需要在SQL Server中定义一个带有循环的存储过程,以在旧产品代码和最新产品代码之间创建桥接表。我不是SQL的专家,我遇到了一些麻烦......

我已经有一个包含所有产品代码更改的源表,但是,我需要创建包含所有OLD产品代码与最新产品代码的关系的表。

源表格如下:

PRD_OLD   ----   PRD_NEW
00001         ----    00003
00002         ----    00003
00003         ----    00004
00004         ----    00005
00006         ----    00007

可以看出,产品1和2对应于产品3.然后3对应于4然后4对应于5,因此1,2,3和4的最新产品ID应为5.

输出表应为:

PRD_OLD   ----   PRD_NEW
00001         ----    00005
00002         ----    00005
00003         ----    00005
00004         ----    00005
00006         ----    00007

注意:在我的表中,代码是包含字母和数字的代码(GUIDS),因此使用最大值将无效...

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用递归CTE执行此操作:

with cte as (
      select prd_old, prd_new, 1 as lev
      from source
      union all
      select cte.prd_old, s.prd_new, lev + 1
      from cte join
           source s
           on cte.prd_new = s.prd_old
     )
select t.*
from (select cte.*, max(lev) over (partition by prd_old) as max_lev
      from cte
     ) t
where lev = max_lev;