如何修剪分层数据结构中的死分支
我们有一个表,它具有一个用于主键的int NodeID列和一个到int ParentID列和一个varchar(25)名称列的自联接。
我们需要一个查询来删除给定的一组叶节点(或底层节点)的所有死分支。 例如,如果给定一组像下面这样的节点,如果NodeID 4被传入,节点4应该被删除,并且由于节点2不再有子节点,它应该被删除。 节点1仍然有一个子节点(节点6),因此该进程将在那里停止。
[0] ROOT
/
[1] Node 1 [3] Node 3
/
[2] Node 2 [6] Node 6 [5] Node 5
/
[4] Node 4
我有一个使用游标的解决方案,但我尽可能避免使用游标,并且更愿意使用批处理方式来完成此操作。 有没有办法与CTE做到这一点? 或者其他方式?
下面的CTE返回所有父母。 我做了一些尝试来改变最后一个选择,删除节点只包含一个孩子或没有孩子的地方。 我已经沿着这些线路执行过任何操作。
任何方法都必须具有一些步骤来升级层次结构并删除没有子节点的节点。
欢迎任何其他想法或方法。
WITH nAncestry (ParentID, NodeID, Name, AncestryID)
AS
(
SELECT n.ParentID, n.NodeID, n.Name, 0 AS AncestryID
FROM Node AS n
WHERE n.NodeID=@nodeID
UNION ALL
SELECT n.ParentID, n.NodeID, n.Name, AncestryID + 1
FROM Node AS n
INNER JOIN nAncestry as a
ON a.ParentID = n.NodeID
)
SELECT ParentID, NodeID, Name
FROM nAncestry
WHERE NodeID <>0
ORDER BY AncestryID DESC
链接地址: http://www.djcxy.com/p/60225.html
上一篇: How to prune dead branches in a hierarchical data structure