如何在SQL上编写反射函数

时间:2014-06-25 12:04:45

标签: sql sql-server tsql

我有一张桌子

Id    PId   code 
12    10    abca
13    12     wwr
14    13     sdf
15    14     aba
16    15     wqe

我需要用父ID ID

替换PID
Id    PId   code 
12    10     abca
13    12     wwr
14    12     sdf
15    12     aba
16    12     wqe

这是我基本需要替换所有孩子的PId 我认为我们需要编写递归函数并需要替换 即时通讯使用sql server 2008 rs,告诉我如何实现这一目标的最佳方式

1 个答案:

答案 0 :(得分:2)

据我了解,您现在拥有一个层次结构,其中包含从顶部到子项到底部的链接,您想要更改它,以便层次结构中的每个子项指向最顶层的父项。

备选我不喜欢:Cursor + a cyclus以找到每行的最顶层记录

我会这样做的方式:(没有经过测试,可能会有一些错误,写出来)

with RecursiveCTE as (
    select ID as TopID,
           ID as ID
      from Table where PId is null
    union all
    select TopID,
           ID
      from Table
      join RecursiveCTE on RecursiveCTE.ID = Table.PId
)
update Table
   set PId = TopID
  from Table
  join RecursiveCTE
    on RecursiveCTE.ID = Table.ID
 where Table.PId is not null

对评论的回应:现在,这取决于你想要做什么。如果没有空案例......这是否意味着有一个周期? (非常糟糕,不容易做,必须检查)或者你知道起始值吗?在这种情况下,您所要做的就是更改

from Table where PId is null

from Table where PId = 10

并更改

where Table.PId <> TopID  

where Table.PId is not null