主キーのintNodeID列と、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は、すべての親を返します。ノードに子が1つしかない、または子が含まれていない場合に、最後の選択を変更して削除しようと何度か試みました。私がそれらの線に沿って試したことは何も実行されません。
どのアプローチでも、階層を上って子のないノードを削除するための何らかの手段が必要になります。
他のアイデアやアプローチは大歓迎です。
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