Vous ne pouvez pas faire quelque chose comme ça ?
;WITH cte AS (....)
SELECT
*
FROM
cte
CROSS APPLY
dbo.myTable tbl ON cte.XXX = tbl.XXX
Mettez le CROSS APPLY
après la définition CTE - dans la seule instruction SQL qui renvoie au CTE. Cela ne fonctionnerait-il pas ? ?
OU : - retournez votre logique - faites un CTE "descendant", qui sélectionne d'abord les nœuds de niveau supérieur, puis parcourt la hiérarchie. De cette façon, vous pouvez facilement déterminer le "père de niveau supérieur" dans la première partie du CTE récursif - quelque chose comme ceci :
;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
Cela vous donnerait quelque chose comme ceci (basé sur vos exemples de données, légèrement étendu) :
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
Désormais, si vous sélectionnez un nœud enfant particulier à partir de cette sortie CTE, vous obtiendrez toujours toutes les informations dont vous avez besoin, y compris le "niveau" de l'enfant et son nœud parent de niveau supérieur.