1

主キーの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
4

0 に答える 0