Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql CTE层次结构正在下降,但从祖先处拾取子节点而不是父节点 解释_Tsql_Sql Server 2008_Common Table Expression - Fatal编程技术网

Tsql CTE层次结构正在下降,但从祖先处拾取子节点而不是父节点 解释

Tsql CTE层次结构正在下降,但从祖先处拾取子节点而不是父节点 解释,tsql,sql-server-2008,common-table-expression,Tsql,Sql Server 2008,Common Table Expression,好吧,标题可能有点过分:) 我将在最后粘贴脚本 想象一下下面的n元树 . | ---1 **(25)** | -----1.1 **(13)** | | | ----1.1.1 (1) | | | ----1.1.2 **(7)** | | | | | ----1.1.2.1 (4) | | | |

好吧,标题可能有点过分:)

我将在最后粘贴脚本

想象一下下面的n元树

.  
|  
---1 **(25)**   
   |  
    -----1.1 **(13)**  
    |    |  
    |    ----1.1.1 (1)  
    |    |  
    |    ----1.1.2 **(7)**  
    |    |    |
    |    |    ----1.1.2.1 (4)        
    |    |    |
    |    |    ----1.1.2.2 (3)  
    |    |    
    |    ----1.1.3 (5)  
    |    
    -----1.2 (2)  
    | 
    |    
    -----1.3 (10)  
以此类推,其中根分支“.”也可以有一个2,3,n分支,该分支也可以有自己的任意树形式,其中n个分支可能来自任何给定节点。每个节点末尾括号中的值可以说是节点处的值。将它们视为具有子帐户的帐户,父帐户是子帐户的总和

我想用CTE做的是直接检索父项下的所有[sub]帐户。因此,为了提供1.1作为搜索点,它将检索树的整个分支。但是,如果我试图聪明地对返回值求和,我将(在这个特定示例中)两次添加1.1.2,一次是通过其子帐户的总和,第二次是通过其自身包含的值的总和

我该怎么做呢

非常感谢:)

以下是脚本:

剧本 桌子 CTE脚本

这是一个基于示例数据的解决方案。它只对没有子节点的节点求和:

DECLARE @tree TABLE
(id INT
,parentid INT
,nodeName VARCHAR(10)
,VALUE INT
)

INSERT @tree (id,parentid,nodeName,VALUE)
VALUES
(1,NULL,'.',NULL),
(2,1,'1',25),
(3,2,'1.1',13),
(4,2,'1.2',2),
(5,2,'1.3',10),
(6,3,'1.1.1',1),
(7,3,'1.1.2',7),
(8,3,'1.1.3',5),
(9,7,'1.1.2.1',4),
(10,7,'1.1.2.2',3)


;WITH recCTE
AS
(
     SELECT id, parentid, nodeName, value, 
            CASE WHEN EXISTS (SELECT 1 FROM @tree AS t1 WHERE t1.parentid = t.id) THEN 1 ELSE 0 END AS hasChildren
     FROM @tree AS t
     WHERE nodeName = '1.1'

     UNION ALL

     SELECT t.id, t.parentid, t.nodeName, t.value, 
            CASE WHEN EXISTS (SELECT 1 FROM @tree AS t1 WHERE t1.parentid = t.id) THEN 1 ELSE 0 END AS hasChildren
     FROM @tree AS t
     JOIN recCTE AS r
     ON   r.id = t.parentid

)
SELECT SUM(VALUE)
FROM recCTE 
WHERE hasChildren = 0
OPTION (MAXRECURSION 0)

不是同样的问题,发布到其他地方的链接也不是特别有帮助。他正在尝试处理树中的叶节点。这正是我发布的链接的内容。+1为您的问题提供脚本。谢谢!不过有一个问题,为什么要使用OPTION语句?@Mustafa-默认情况下,递归CTE限制为100个级别-设置
MAXRECURSION 0
会删除该限制
WITH 
DescendToChild([ID],ParentID,Value)
AS
(

    --base case
    SELECT [ID],ParentID,Value FROM Account
    Where ParentID = '1.1'
        
        
    UNION ALL
        
    ----recursive step
    SELECT
        A.[ID],A.ParentID,A.Value FROM Account as A
        INNER JOIN DescendToChild D on A.ParentID = D.ID
)
select * from DescendToChild;
DECLARE @tree TABLE
(id INT
,parentid INT
,nodeName VARCHAR(10)
,VALUE INT
)

INSERT @tree (id,parentid,nodeName,VALUE)
VALUES
(1,NULL,'.',NULL),
(2,1,'1',25),
(3,2,'1.1',13),
(4,2,'1.2',2),
(5,2,'1.3',10),
(6,3,'1.1.1',1),
(7,3,'1.1.2',7),
(8,3,'1.1.3',5),
(9,7,'1.1.2.1',4),
(10,7,'1.1.2.2',3)


;WITH recCTE
AS
(
     SELECT id, parentid, nodeName, value, 
            CASE WHEN EXISTS (SELECT 1 FROM @tree AS t1 WHERE t1.parentid = t.id) THEN 1 ELSE 0 END AS hasChildren
     FROM @tree AS t
     WHERE nodeName = '1.1'

     UNION ALL

     SELECT t.id, t.parentid, t.nodeName, t.value, 
            CASE WHEN EXISTS (SELECT 1 FROM @tree AS t1 WHERE t1.parentid = t.id) THEN 1 ELSE 0 END AS hasChildren
     FROM @tree AS t
     JOIN recCTE AS r
     ON   r.id = t.parentid

)
SELECT SUM(VALUE)
FROM recCTE 
WHERE hasChildren = 0
OPTION (MAXRECURSION 0)