U ugvanxk Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-03 #1 存储过程里有游标, http://www.delphibbs.com/delphibbs/dispq.asp?lid=1416761
X xianjun Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-03 #3 问题: 树型数据库求和的问题 id pid value kind 0 -1 0 1 0 1 2 0 1 3 0 1 4 1 1 5 2 2 6 3 2 7 4 2 8 4 2 9 1 2 10 1 2 建立一棵树,加的字节点可能 kind=1 或kind=2 , 当kind=0 或kind=1 时,value的值都没有,只有kind=2即叶节点的情况才有值。 即kind=2 不可能再有字节点 然后要把上一级的 kind=1的赋值, 最后求出 kind=0的值,即最高的节点的值。 考虑添加 删除 修改的情况 用存储过程,或触发器,程序也可以 最好用存储过程实现。 用递归的方式,先找到符合条件的第一级节点,打入临时表 然后再针对临时表的记录进行递归 如果用的是Oracle数据库,直接就用Connect by语句把所有符合条件的记录列出来了 进行SUM求和就搞定。 用上面的方法之一写出一个存储过程 然后添加 删除 修改的时候在触发器中调用它。
问题: 树型数据库求和的问题 id pid value kind 0 -1 0 1 0 1 2 0 1 3 0 1 4 1 1 5 2 2 6 3 2 7 4 2 8 4 2 9 1 2 10 1 2 建立一棵树,加的字节点可能 kind=1 或kind=2 , 当kind=0 或kind=1 时,value的值都没有,只有kind=2即叶节点的情况才有值。 即kind=2 不可能再有字节点 然后要把上一级的 kind=1的赋值, 最后求出 kind=0的值,即最高的节点的值。 考虑添加 删除 修改的情况 用存储过程,或触发器,程序也可以 最好用存储过程实现。 用递归的方式,先找到符合条件的第一级节点,打入临时表 然后再针对临时表的记录进行递归 如果用的是Oracle数据库,直接就用Connect by语句把所有符合条件的记录列出来了 进行SUM求和就搞定。 用上面的方法之一写出一个存储过程 然后添加 删除 修改的时候在触发器中调用它。
U ugvanxk Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-03 #4 可能有这样的 kind=1 它的下层还是1 不知道多少层 关键这个value值不是一开始就赋上去的,还要这个表和其他表的关系,然后计算才得到
X xianjun Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-03 #6 你管它Kind的值是什么,递归是根据id = pid来的 跟kind值无关,这个值只是一个过滤条件而已。 但你说kind为2的子节点的Value值是有的,根据这个来统计啊 怎么又跟其他表相关了
U ugvanxk Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-03 #7 先要通过一定的计算关系,计算出结果付到kind=2,或是手工输入 关键是有游标的递规的存储过程可以不可以,我的错误在什么地方
U ugvanxk Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-06 #8 id pid value kind sysid attr 0 -1 0 1 0 1 2 0 1 3 0 1 4 1 1 5 2 2 6 3 2 7 4 2 8 4 2 9 1 2 10 1 2 无限层次的树 sysid 相同的说明是同一个项目,计算只能是同一个项目,可能是这一项目的任意节点 atr=0 表示此值是手工输入 attr=1 表示要通过关系利用另外的表计算出来 kind=1或 kind=2 的attr都有可能为0 即kind=2 不可能再有子节点 然后要把上一级的 kind=1的赋值, 最后求出给定节点的值。 // 考虑添加 删除 修改的情况 暂不考虑,因为是动态的计算, 考虑用存储过程 //,或触发器,程序也可以
id pid value kind sysid attr 0 -1 0 1 0 1 2 0 1 3 0 1 4 1 1 5 2 2 6 3 2 7 4 2 8 4 2 9 1 2 10 1 2 无限层次的树 sysid 相同的说明是同一个项目,计算只能是同一个项目,可能是这一项目的任意节点 atr=0 表示此值是手工输入 attr=1 表示要通过关系利用另外的表计算出来 kind=1或 kind=2 的attr都有可能为0 即kind=2 不可能再有子节点 然后要把上一级的 kind=1的赋值, 最后求出给定节点的值。 // 考虑添加 删除 修改的情况 暂不考虑,因为是动态的计算, 考虑用存储过程 //,或触发器,程序也可以
X xianjun Unregistered / Unconfirmed GUEST, unregistred user! 2002-12-06 #9 存储过程当然可以递归,但是你写成触发器的时候就不能这么写,会死循环。 无论SYSID,ATR还是KIND都只是一个过滤条件而已,方法还是我上面说的: 用递归的方式,先找到符合条件的第一级节点,打入临时表 然后再针对临时表的记录进行递归
存储过程当然可以递归,但是你写成触发器的时候就不能这么写,会死循环。 无论SYSID,ATR还是KIND都只是一个过滤条件而已,方法还是我上面说的: 用递归的方式,先找到符合条件的第一级节点,打入临时表 然后再针对临时表的记录进行递归