我有一个包含层次结构数据的表,如:
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做递归部分,找到topParent为childID.
但
我想要表中的ForEach行 – 执行带有childID值的CTE!
我尝试用CROSS应用程序:
就像是 :
select * from myTable Cross Apply ( ;WITH cte AS (....) )
但IMHO(从我的测试!!) – 它不可能.
将递归CTE放在UDF中的另一个想法具有性能损失(udf的问题,我们知道).
我如何创建这个查询,使其实际工作? (或一些附近的解决方案)?
这是ive试过的
http://data.stackexchange.com/stackoverflow/query/edit/69458
解决方法
不知道我明白你在找什么,但可能是这样.
;WITH c AS (SELECT childid,parentid,parentid AS topParentID FROM @myTable WHERE childid = parentid UNION ALL SELECT T.childid,T.parentid,c.topparentid FROM @myTable AS T INNER JOIN c ON T.parentid = c.childid WHERE T.childid <> T.parentid) SELECT childid,topparentid FROM c ORDER BY childid
与marc_s answer相同,区别在于我使用您的表变量,并且您的根节点具有childID = parentID的事实,其中由marc_s的答案对根节点具有parent_ID = null.在我看来,根节点的parent_ID = null最好.