父子的 T-SQL 递归组

Posted

技术标签:

【中文标题】父子的 T-SQL 递归组【英文标题】:T-SQL Recursive Group for Parent Child 【发布时间】:2014-06-02 21:01:07 【问题描述】:

我在 SQL Server 中使用 T-SQL 并有以下“TEST”表:

CHILD       PARENT      VAL         WEIGHTAGE
============================================================
abcd        yz          NULL        1
efgh        abcd        NULL        1
ijkl        abcd        70          1
mnop        NULL        5           1
qrst        efgh        100         1
uvwx        efgh        200         -1
yz          NULL        NULL        1

“CHILD”列包含要显示的所有标签。 “PARENT”列表示递归父子关系。

例如,“yz”是“abcd”的父级。 "abcd" 又是 "efgh" 和 "ijkl" 的父级。反过来,“efgh”也是“qrst”和“uvwx”的父级。

仅出现在“CHILD”中(但不在“PARENT”中)的值可以从数据库中加载。现在,我想根据递归父子关系自动计算剩余的“NULL”值。

因此,最终查询输出将按如下方式计算(它还利用“WEIGHTAGE”列进行计算):

CHILD       PARENT      VAL                 WEIGHTAGE
==========================================================================
abcd        yz          (-100+70)=-30       1
efgh        abcd        (100-200) = -100    1
ijkl        abcd        70                  1
mnop        NULL        5                   1
qrst        efgh        100                 1
uvwx        efgh        200                 -1
yz          NULL        -30                 1

感谢您的帮助。谢谢。

【问题讨论】:

添加了sql-server标签以明确这一点 【参考方案1】:

这是一个递归 CTE 示例。您的列child 指的是当前行的名称,而不是它的子行。这让我很困惑,所以我将专栏从 child 重命名为 name

; with  CTE as
        (
        select  name as root
        ,       name
        ,       parent
        ,       val * weightage as change
        from    test
        union all
        select  parent.root
        ,       child.name
        ,       child.parent
        ,       child.val * child.weightage as change
        from    CTE parent
        join    test child
        on      child.parent = parent.name 
        )
select  root
,       sum(change) as val
from    CTE
group by
        root

打印出来:

abcd   -30
efgh   -100
ijkl   70
mnop   5
qrst   100
uvwx   -200
yz     -30

See it working at SQL Fiddle.

【讨论】:

以上是关于父子的 T-SQL 递归组的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL使用CTE递归

我可以在 T-SQL 数据库中执行递归 SELECT

T-Sql 递归查询(给定节点查所有父节点所有子节点的方法)

通过递归检查父子关系C#构建树类型列表

如何在T-SQL中使用递归CTE获得完整的层次结构?

如何避免父子jpa关系中的json响应递归?