父子的 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 递归组的主要内容,如果未能解决你的问题,请参考以下文章