SQL CTE递归查询

usermoney表:

需求:需要查询各级用户的money总和,比如,查询userid=2的用户的money总和需要包括他的子级以及衍生子级的money总和,以此类推

第一步:

 1 with cte(userid,money,level_) as
 2 (
 3 SELECT userid, money, 1 AS level_ FROM usermoney
 4 union all
 5 select m.userid,m.money,a.level_ +1
 6 from cte a
 7 inner join usermoney m
 8 on a.userid=m.pid
 9 )
10 
11 
12 select * from cte

通过cte表的递归可以求出各个userid的递归深度(level_),结果如图:

我们可以再加一列path_ 来直观的看出父子节点的关系:

with cte(userid,money,level_,path_) as
(
SELECT userid, money, 1 AS level_ ,'' as path_ FROM usermoney
union all
select m.userid,m.money,a.level_ +1,m.pid||','||a.path_
from cte a
inner join usermoney m
on a.userid=m.pid
)


select * from cte

结果如下:

需要注意的是 我们要取递归深度最深的记录,例如userid=4的记录既有level_=2的记录也有level_=3的记录,我们要取level_=3的那条记录 即path_=2,1, 那一条

计算总和就应该是userid=4的money+userid=2的money+userid=1的money

 

方法2:oracle:

select userid,money from usermoney
start with userid=7
connect by prior pid=userid

select sum(money)
from usermoney
start with userid=7
connect by prior pid=userid

posted @ 2018-08-14 17:13  阳刚猛男  阅读(188)  评论(0编辑  收藏  举报