楼主: jvkojvko

[精华] 对BOM展开并计算最终使用量的解答

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
51#
发表于 2008-7-17 00:03 | 只看该作者

回复 #50 lypch 的帖子

因为你要求起点要有A又有B, 所以这个with vw_bom as ... 里面包含了两棵树。这里面有一些数据是重复的,因为B本身是A的下级。加上了个ROOT,就可以区别这些数据是来自A或者B。相当于在这个子集合里面,(root, parent, child) 构成了主键。

inner层把vw_bom的叶子找出来。这些叶子仍然有重复的。然后我们从每个叶子往它的根上找,这就需要三个数据来从vw_bom里面定位记录:(root, parent, child)

start with 带个 ROOT = inner.ROOT 就是为了确保是同一个叶子;CONNECT BY 带上这条件是为了保证是同一棵树。

刚才想起来9i可能不支持规则表达式,那你就自己用instr, substr代替吧,很简单的。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
52#
发表于 2008-7-17 00:15 | 只看该作者
原帖由 yangtingkun 于 2008-7-16 10:02 发表


Oracle很可能修改START WITH的读取算法,比如对START WITH做了优化等等,这时不能保证START WITH的读取顺序仍然和当前一致,但是根据SIBLINGS 的定义和后向兼容性的考虑,Oracle不会修改ORDER SIBLINGS BY的排序规则。
这里添加SIBLINGS就是为了避免算法的改变而导致排序的改变,因为这个SQL依赖于这个排序的结果。


杨大侠明鉴,siblings是指同层次的兄弟节点,order siblings by 的作用是:当有多个兄弟可选时,先访问哪一个。它并不能决定是“先访问同层节点”还是“先访问下级节点”(而这个才是你判断的依据)。

假设有这么个树:
A
BCD
EFG

假设第二三层的点是一一对应的。
访问完A之后,BCD中先选哪一个?那就是order siblings by起作用的地方。如果是order siblings by node_id, 顺序就是:ABECFDG;如果是order siblings by node_id DESC, 顺序就是:ADGCFBE

ORACLE现在的做法,它每个路径都会走到底才回溯, 也就是深度优先的。如果哪天ORACLE心血来潮换成广度优先,顺序就变成:

order siblings by node_id: ABCDEFG
order siblings by node_id DESC: ADCBGFE

在这种情况下你的判断方法就失效了。

如果你说的order siblings by能起作用,如何解释把顺序反过来以后依然成立呢?



ps:我找到oracle的官方文档看了,深度优先顺序是有保证的,但和order siblings by无关,你完全可以把它拿掉,结果依然正确。

[ 本帖最后由 newkid 于 2008-7-17 05:13 编辑 ]

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
53#
发表于 2008-7-17 08:17 | 只看该作者
支持授精

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
54#
发表于 2008-7-17 08:47 | 只看该作者
NewKid,我佩服的五体投地。

原帖由 newkid 于 2008-7-17 00:15 发表


杨大侠明鉴,siblings是指同层次的兄弟节点,order siblings by 的作用是:当有多个兄弟可选时,先访问哪一个。它并不能决定是“先访问同层节点”还是“先访问下级节点”(而这个才是你判断的依据)。

假设有这么个树:
A
BCD
EFG

假设第二三层的点是一一对应的。
访问完A之后,BCD中先选哪一个?那就是order siblings by起作用的地方。如果是order siblings by node_id, 顺序就是:ABECFDG;如果是order siblings by node_id DESC, 顺序就是:ADGCFBE

ORACLE现在的做法,它每个路径都会走到底才回溯, 也就是深度优先的。如果哪天ORACLE心血来潮换成广度优先,顺序就变成:

order siblings by node_id: ABCDEFG
order siblings by node_id DESC: ADCBGFE

在这种情况下你的判断方法就失效了。

如果你说的order siblings by能起作用,如何解释把顺序反过来以后依然成立呢?



ps:我找到oracle的官方文档看了,深度优先顺序是有保证的,但和order siblings by无关,你完全可以把它拿掉,结果依然正确。

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
55#
发表于 2008-7-17 10:57 | 只看该作者
如果Oracle象聚集函数那样可以自定义sys_connect_by_path 函数, 那就太棒了.
比如自定义 sys_sum_by_path, sys_count_by_path 等, 呵呵, 异想天开,
要是我开发Oracle产品我就把这功能加上去.

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
56#
发表于 2008-7-17 10:59 | 只看该作者
原帖由 zhangweicai74 于 2008-7-17 08:17 发表
支持授精

OK, 已受精.

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
57#
发表于 2008-7-17 11:03 | 只看该作者
原帖由 newkid 于 2008-7-17 00:15 发表


杨大侠明鉴,siblings是指同层次的兄弟节点,order siblings by 的作用是:当有多个兄弟可选时,先访问哪一个。它并不能决定是“先访问同层节点”还是“先访问下级节点”(而这个才是你判断的依据)。

假设有这么个树:
A
BCD
EFG

假设第二三层的点是一一对应的。
访问完A之后,BCD中先选哪一个?那就是order siblings by起作用的地方。如果是order siblings by node_id, 顺序就是:ABECFDG;如果是order siblings by node_id DESC, 顺序就是:ADGCFBE

ORACLE现在的做法,它每个路径都会走到底才回溯, 也就是深度优先的。如果哪天ORACLE心血来潮换成广度优先,顺序就变成:

order siblings by node_id: ABCDEFG
order siblings by node_id DESC: ADCBGFE

在这种情况下你的判断方法就失效了。

如果你说的order siblings by能起作用,如何解释把顺序反过来以后依然成立呢?



ps:我找到oracle的官方文档看了,深度优先顺序是有保证的,但和order siblings by无关,你完全可以把它拿掉,结果依然正确。


树形查询的执行计划决定了Oracle采用深度的方式遍历树。
至于SBILINGS确实没有必要

使用道具 举报

回复
论坛徽章:
109
开发板块每日发贴之星
日期:2006-06-06 01:02:23数据库板块每日发贴之星
日期:2006-12-30 01:03:28每日论坛发贴之星
日期:2008-07-12 01:01:37行业板块每日发贴之星
日期:2008-07-23 01:02:20ITPUB元老
日期:2010-11-12 15:19:292014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
58#
发表于 2008-7-17 11:27 | 只看该作者
很好

使用道具 举报

回复
论坛徽章:
9
六级虎吧徽章
日期:2009-01-03 20:00:34
59#
发表于 2008-7-17 11:32 | 只看该作者
恭喜发哥!
受精成功!

使用道具 举报

回复
论坛徽章:
61
ITPUB元老
日期:2010-11-30 11:31:09马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02夏利
日期:2014-01-17 13:39:182013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-02-07 13:08:13蛋疼蛋
日期:2012-01-06 13:08:02蜘蛛蛋
日期:2012-01-06 10:45:222012新春纪念徽章
日期:2012-01-04 11:53:54
60#
发表于 2008-7-17 11:44 | 只看该作者
呵呵!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表