sql-server – SQL Server CTE – 找到顶部parentID forEach childID?

前端之家收集整理的这篇文章主要介绍了sql-server – 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做递归部分,找到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

SE-Data

marc_s answer相同,区别在于我使用您的表变量,并且您的根节点具有childID = parentID的事实,其中由marc_s的答案对根节点具有parent_ID = null.在我看来,根节点的parent_ID = null最好.

猜你在找的MsSQL相关文章