假设我有一个名为#orglist的表
CREATE TABLE #OrgList (
OrgUnitId int,
ParentOrgUnitId int,
PersonId int,
isExcluded bit
);
INSERT INTO #OrgList(OrgUnitId, ParentOrgUnitId, PersonId, isExcluded) VALUES
(1, NULL, 100, 0), (2,1, 101, 0), (3,1,102,0), (4,2,103,1), (5,2,104,0), (6,3,105,0), (7,4,106,0), (8,4,107,0), (9,4,108,0), (10,4,109,0), (11,4,110,1), (12,11,111,0)
我的层次树结构如下所示
我的cte是这样的:
;
with cte as (
select OrgUnitId, ParentOrgUnitId, PersonId, isExcluded , 0 as level_num
from #OrgList
where ParentOrgUnitId is null
UNION ALL
select o.OrgUnitId, o.ParentOrgUnitId, o.PersonId, o.isExcluded , level_num+1 as level_num
from #OrgList o
join cte on o.ParentOrgUnitId=cte.OrgUnitId
)
select * from cte
我排除orgunitid=4和=11,然后我想更新我的递归查询,它将重新计算树并显示新树的详细信息,包括级别移动(可以有更多级别和更多连续排除,当然除了根节点):
4条答案
按热度按时间hk8txs481#
您只需在cte中添加第二个联合:
cygmwpex2#
我的方法:
使用排除计数器扩展初始cte(
ExclusionCount
),计算从根节点到叶节点的排除节点数。添加另一个递归cte来构造上行路径(
cte_upwards
)对于每个叶节点。现在减小在初始cte中添加的计数器。使用
cross apply
选择第一个向上路径达到0 exlusion count的节点。解决方案:
结果:
o3imoua43#
我添加了一个virtualparentorgunitid,其中包含考虑了排除节点的父节点。我还添加了一个计数器virtualInstance,它将报告此节点与其虚拟父节点之间的实际跃点数。
如果未排除,virtualparentorgunitid将使用父级的id,否则它将使用父级的virtualparentorgunitid,这允许多个级别的链接。
结果如下:
px9o7tmv4#