このようなことはできませんか?
;WITH cte AS (....) SELECT * FROM cte CROSS APPLY dbo.myTable tbl ON cte.XXX = tbl.XXX
プレ>
CROSS APPLY
を入れます 後 CTE 定義 - CTE を参照する 1 つの SQL ステートメントに変換します。うまくいきませんか??または: - ロジックをひっくり返します - 「トップダウン」CTE を実行します。これは、最初にトップレベルのノードを選択してから、階層を反復処理します。このようにして、再帰的 CTE の最初の部分で「最上位の親」を簡単に判別できます - 次のように:
;WITH ChildParent AS ( SELECT ID, ParentID = ISNULL(ParentID, -1), SomeName, PLevel = 1, -- defines level, 1 = TOP, 2 = immediate child nodes etc. TopLevelFather = ID -- define "top-level" parent node FROM dbo.[Agent_Agents] WHERE ParentID IS NULL UNION ALL SELECT a.ID, ParentID = ISNULL(a.ParentID, -1), a.SomeName, PLevel = cp.PLevel + 1, cp.TopLevelFather -- keep selecting the same value for all child nodes FROM dbo.[Agent_Agents] a INNER JOIN ChildParent cp ON r.ParentID = cp.ID ) SELECT ID, ParentID, SomeName, PLevel, TopLevelFather FROM ChildParent
プレ>これにより、次のようなノードが得られます (サンプル データに基づいて、わずかに拡張されています):
ID ParentID SomeName PLevel TopLevelFather 20 -1 Top#20 1 20 4 -1 TOP#4 1 4 8 -1 TOP#8 1 8 7 8 ChildID = 7 2 8 3 7 ChildID = 3 3 8 2 4 ChildID = 2 2 4 9 20 ChildID = 9 2 20 5 9 ChildID = 5 3 20 1 5 ChildID = 1 4 20
プレ>この CTE 出力から特定の子ノードを選択すると、子の「レベル」とその最上位の親ノードを含む、必要なすべての情報が常に取得されます。