क्या आप ऐसा कुछ नहीं कर सकते?
;WITH cte AS (....)
SELECT
*
FROM
cte
CROSS APPLY
dbo.myTable tbl ON cte.XXX = tbl.XXX
CROSS APPLY
लगाएं बाद CTE परिभाषा - एक 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
अब यदि आप इस सीटीई आउटपुट से किसी विशेष चाइल्ड नोड का चयन करते हैं, तो आपको हमेशा वह सभी जानकारी प्राप्त होगी जो आपको चाहिए - बच्चे के "स्तर" और उसके शीर्ष-स्तरीय पैरेंट नोड सहित।