我有一张桌子
Id PId code
12 10 abca
13 12 wwr
14 13 sdf
15 14 aba
16 15 wqe
我需要用父ID ID
替换PIDId PId code
12 10 abca
13 12 wwr
14 12 sdf
15 12 aba
16 12 wqe
这是我基本需要替换所有孩子的PId 我认为我们需要编写递归函数并需要替换 即时通讯使用sql server 2008 rs,告诉我如何实现这一目标的最佳方式
答案 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