Können Sie so etwas nicht tun?
;WITH cte AS (....)
SELECT
*
FROM
cte
CROSS APPLY
dbo.myTable tbl ON cte.XXX = tbl.XXX
Setzen Sie das CROSS APPLY
nach die CTE-Definition - in die eine SQL-Anweisung, die auf den CTE zurückverweist. Würde das nicht funktionieren??
ODER: - Drehen Sie Ihre Logik um - Führen Sie einen "Top-Down" -CTE durch, der zuerst die Knoten der obersten Ebene auswählt und dann die Hierarchie durchläuft. Auf diese Weise können Sie den "Vater der obersten Ebene" im ersten Teil des rekursiven CTE leicht bestimmen - etwa so:
;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
Dies würde Ihnen Knoten in etwa wie folgt geben (basierend auf Ihren Beispieldaten, leicht erweitert):
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
Wenn Sie nun einen bestimmten untergeordneten Knoten aus dieser CTE-Ausgabe auswählen, erhalten Sie immer alle Informationen, die Sie benötigen - einschließlich der "Ebene" des untergeordneten Knotens und seines übergeordneten Knotens der obersten Ebene.