父子项的T-SQL递归组

时间:2014-04-18 10:54:28

标签: sql sql-server parent-child recursive-query

我在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

感谢您的帮助。感谢。

1 个答案:

答案 0 :(得分: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.