我有一個包含層次結構數據的表格 - 是這樣的:SQL Server CTE - 查找頂級parentID forEach childID?
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
所需的輸出:
我創建了一個遞歸CTE指找到我頂fatherID
。
喜歡的東西:
;WITH cte AS (
SELECT a.childID
,a.parentID
,1 AS lvl
FROM [Agent_Agents] a
WHERE a.childID = 214 //<==== value to begin with !! - thats part the problem
UNION ALL
SELECT tmp.childID
,tmp.parentID
,cte.lvl+1
FROM [Agent_Agents] tmp
INNER JOIN cte ON tmp.childID = cte.parentID
WHERE cte.childID<>cte.parentID
)
SELECT *
FROM cte
WHERE lvl = (
SELECT MAX(lvl)
FROM cte
)
問題:
我執行的CTE與明確childID
值開始與(214)! 所以它只給了我214的價值。 CTE執行遞歸部分併爲childID找到topParent。
但 我想ForEach row in the Table
- 與childID
值執行CTE!
我試圖與CROSS APPLY
做到這一點:
喜歡的東西:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
但恕我直言(從我的測試!) - 它是不可能的。
將遞歸CTE放入UDF中的另一個想法具有性能損失(我們知道的udf的問題)。
如何創建此查詢,以便它實際上工作? (或一些接近解決方案)?
這裏是我試過
https://data.stackexchange.com/stackoverflow/query/edit/69458
ive爲所需的輸出添加了一個打印屏幕。 –
@RoyiNamir - 我對SE數據的查詢返回你想要的。我剛添加了'name'和'parentID'列。 –
我很高興聽到你爲什麼決定從最頂層開始 - 而不是葉子....這裏的邏輯是什麼(雖然它的工作)?爲什麼我們不能從葉子開始走向最頂層的葉子? –