我们有一个表,其中包含主键的int NodeID列和int ParentID列的自连接以及varchar(25)Name列。
我们需要一个查询,它将删除给定叶节点集(或底层节点)的所有死分支。例如,如果给出一组如下所示的节点,如果传入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