我有一个包含层次结构数据的表 - 例如:
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
所需的输出:
我创建了一个递归 CTE,它发现我是 top 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
)
问题:
我以 (214) 开头的显式 值执行了 CTE !childID
所以它只给了我 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