首页 新闻 会员 周边 捐助

如何用sql实现无限级关系中对每个父级的所有孩子进行数目统计。

0
悬赏园豆:50 [已解决问题] 解决于 2020-01-17 11:44

这是表结构:

目前我用了一种低效的方法进行了实现,但是性能真的很低,完成一次30万条的数据统计需要30分钟左右,以下是我的实现:
UPDATE Relaton
SET [ChildNum]=(SELECT COUNT(1) FROM Relaton M WHERE M.[Left] > R.[Left] AND M.[Right] < R.[Right])
FROM Relaton R

有更好的实现方式吗?

这里是统计伞下所有的孩子数目,不能用简单的GROUP BY进行分组统计。

anech的主页 anech | 初学一级 | 园豆:92
提问于:2020-01-15 11:30
< >
分享
最佳答案
0

很好解决,我看你现在有个depth,是存放的树的深度吧,那子节点数量也搞一个字段:ChildrenCount,插入新节点删除新节点时就递归更新这个数据,反正depth也是这么更新的吧?不差多一个。

收获园豆:35
会长 | 专家六级 |园豆:12463 | 2020-01-15 14:27

你这样是可以,但我其实是简化了需求,我原本要统计的是每个父下所有孩子的积分,这个积分是变动的,想看一下有没有更好的sql语法

anech | 园豆:92 (初学一级) | 2020-01-15 14:29

我采用了类似的方案,全部执行完只要10秒不到,先统计下一级的数量,然后上级的等于下一级数量总合

anech | 园豆:92 (初学一级) | 2020-01-17 11:46
其他回答(3)
0

你这是涉及到表的修改才会这么慢,查询不会

收获园豆:5
猝不及防 | 园豆:2878 (老鸟四级) | 2020-01-15 11:41

查询也是一样的,时间都花在了统计上,不是更新上
SELECT [MemberId], (SELECT COUNT(1)
FROM [Relation] M WHERE
M.[Left] > R.[Left] AND M.[Right] < R.[Right]) AS ChildNum
FROM [Relation] R
我是这样统计的,时间都差不多,更新保用了1秒不到,但统计需要很长时间

支持(0) 反对(0) anech | 园豆:92 (初学一级) | 2020-01-15 11:46
0

where 条件加索引试了么

收获园豆:5
Ctrl` | 园豆:3317 (老鸟四级) | 2020-01-15 13:56

加了,right和left都有

支持(0) 反对(0) anech | 园豆:92 (初学一级) | 2020-01-15 14:21
0
收获园豆:5
geass.. | 园豆:1821 (小虾三级) | 2020-01-17 11:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册