我们有一个表,它有一个 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