树形数据表逐级向上汇总更新,求高效SQL范例,具体入内。。

william3033 2014-09-29 09:44:58
目前正在做一个进度计划管理模型,计划表结构为树形。
主要数据列有作业编码、作业名称、上级作业编码、计划开始、计划完成、实际开始、实际完成、完成情况(未开始、施工中、完成)等几列。
核心业务操作分为两种,1、编排计划(设置计划开完工),2、盘点计划(设置实际开工、百分比)。

业务逻辑上要求由下往上汇总。如编制计划时,设置好最下级计划(叶子节点)的计划开始、完成实际,自动往上逐级汇总生成上级计划开始、完成(由下级的最小的开始实际、最大的完成得到上级计划开完工);
盘点计划时同理,根据下级计划的实际开完工、完成情况自动往上汇总生成上级计划的实际开完工情况(当所有下级都完成,设置上级计划的开完工、状态为完成;全部都未开始,则上级设为未开始;一部分完成,则只设置开始时间,状态为施工中)。

每一个计划的数据量在1500-2000条左右,叶子节点数约6-800,计划树形一般约5层。数据库为oracle 11g。

目前已经写有几版SQL语句,但总体效率不行,求给力高效SQL……

很久没来CSDN,分可加。。
...全文
1099 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
william3033 2014-10-02
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
也可以这样写,这样就不需要连接表了,速度应该更快一点
SELECT ID,MAX(NAME) NAME,MIN(S) STARTTIME,MAX(E) ENDTIME
from (select T.*,CONNECT_BY_ROOT(STARTTIME) S,CONNECT_BY_ROOT(ENDTIME) E
    from T
    CONNECT BY PRIOR PID=ID) A
GROUP BY ID
谢谢斑斑指导。这两天我集中精力把相关的业务优化了一下,效率有相当大的提升。基本和斑斑的思路一致。 PS:现在CSDN的人气好像不行啊。。
bw555 2014-09-29
  • 打赏
  • 举报
回复
未测试,计算各节点的起止日期

SELECT A.ID,MAX(A.NAME) NAME,MIN(B.STARTTIME) STARTTIME,MAX(B.ENDTIME) ENDTIME
from (select T.*,CONNECT_BY_ROOT(ID) SID from T
    CONNECT BY PRIOR PID=ID) A,T B
WHERE A.SID=B.ID
GROUP BY A.ID
bw555 2014-09-29
  • 打赏
  • 举报
回复
也可以这样写,这样就不需要连接表了,速度应该更快一点
SELECT ID,MAX(NAME) NAME,MIN(S) STARTTIME,MAX(E) ENDTIME
from (select T.*,CONNECT_BY_ROOT(STARTTIME) S,CONNECT_BY_ROOT(ENDTIME) E
    from T
    CONNECT BY PRIOR PID=ID) A
GROUP BY ID

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧