用Oracle8的层次查询生成BOM树的实现方法

转载 2004年07月25日 13:13:00

用Oracle8的层次查询生成BOM树的实现方法
作者:流方 主页:http://liulee.yeah.net

  最近收到网友一个问题,关于Oracle的层次查询的问题,发现Oracle 8i中一个非常有用的查询子句:
select level,rowid,...
  from ...
  where ...
  start with ...
  connect by expression;
语法说明:
*****************************************************
start with ...
connect by
(这是一个字句,不能拆开来写) 
语法的详细参考,请参考 ORACLE Release 8.0.5 Documentation Library中的 SELECT 帮助
文件位置 doc/database.804/a58225/ch4l.htm
简单说明:
start with ... connect by : 建立一个层次查询("Hierarchical Queries")
start with ... 子句:用户根记录的条件
connect by     子句:用于子记录合父记录的连接方式。是一个特定的条件表达式,必须为其中之一:
 PRIOR expr comparison_operator expr
 expr comparison_operator PRIOR expr

如果定义了start with... connect by子句,level就返回当前记录的层次号。
*****************************************************

这个语法通过定义一个cursor或视图就可以得到一个层次型的结果集,非常有用,特别是对于象生产企业的EBOM树的生成而言,
将明显改变BOM树生成的执行效率,因此,我将这个语法的内容做了分析:

给定这样的数据:
    DOC_PR  DOC_CH               TITLE                                  
--------- -------------------- -----------------------
      DOC   A                    A类                                     
        A   A2                   A-2                                     
        A   A3                   A-3                                     
        A   A1                   A-1                                     
       A1   A11                  A1-1                                    
      DOC   B                    B类                                     
        B   B1                   B-1                                     
        B   B2                   B-2                                     
        B   B3                   B-3                                     
       B3   B31                  B-3-1                                   
      DOC   C                    C类                                     
        C   C1                   test C1                                 
        
定义一个cursor
Declare curTree Cursor For              
 select level, doc_ch, title, rowid  
  from doc_tree                   
  start with doc_pr = 'DOC'   
  connect by doc_pr = Prior doc_ch;
  
返回结果集如下:
   LEVEL DOC_CH               TITLE                                    ROWID
-------- -------------------- ---------------------------------------- ------------------
       1 A                    A类                                      AAAAi+AADAAAAyNAAE
       2 A2                   A-2                                      AAAAi+AADAAAAyNAAM
       2 A3                   A-3                                      AAAAi+AADAAAAyNAAN
       2 A1                   A-1                                      AAAAi+AADAAAAyNAAP
       3 A11                  A1-1                                     AAAAi+AADAAAAyNAAS
       1 B                    B类                                      AAAAi+AADAAAAyNAAF
       2 B1                   B-1                                      AAAAi+AADAAAAyNAAO
       2 B2                   B-2                                      AAAAi+AADAAAAyNAAQ
       2 B3                   B-3                                      AAAAi+AADAAAAyNAAR
       3 B31                  B-3-1                                    AAAAi+AADAAAAyNAAB
       1 C                    C类                                      AAAAi+AADAAAAyNAAG
       2 C1                   test C1                                  AAAAi+AADAAAAyNAAC
         
这段语法的ORACLE内部逻辑我分析如下:
 选择 level,doc_ch,title,rowid
 从 doc_tree
 以 doc_pr = "DOC"开始
 用 doc_pr = 上一个结果的 doc_ch来连接
 
取出第一个结果集后, as_start自动转换为 当前行的 doc_ch,然后执行
select level, doc_ch, title, rowid
 from doc_tree where doc_pr = prior doc_ch 
这样循环本层次结果集,然后再开始下一个结果集的处理。
这是内部的逻辑,而返回给用户的是一个按层次完成的结果集


有了这样一个结果集,对于建立treeview是非常方便的,只要循环所有记录就可以轻松实现了。     

在Sybase,MS SQL Server中不知有没有这样的语法,我不是太清楚,如果您知道,请告诉我。

现在我在MS SQL Server中的实现是这样的:
加入字段level而不是伪列。实现原理同上面是一致的。

 

ERP中绘制树状BOM图

  • 2012年06月21日 15:37
  • 962B
  • 下载

BOM核算及树型排序

          我相信好多程序员朋友都遇到过核算公司BOM,求一个成品的单价的问题。在CSDN上,也有许多朋友发贴问这样的问题。我为我们公司开发了许多报表,涉及到各个部门,当然也包括采购部门(采购...
  • fa_ge
  • fa_ge
  • 2007-11-21 09:04:00
  • 2528

树型递归在BOM中测算可用量的范例

在SqlServer 2005以上提供了With 关键字的递归算法,这种对一
  • qiushuisen
  • qiushuisen
  • 2014-10-13 11:49:17
  • 1914

用Oracle8的层次查询生成BOM树的实现方法

用Oracle8的层次查询生成BOM树的实现方法作者:流方 主页:http://liulee.yeah.net   最近收到网友一个问题,关于Oracle的层次查询的问题,发现Oracle 8i中一...
  • Drate
  • Drate
  • 2004-07-25 13:13:00
  • 2377

BOM树结构处理(最后一层的QTY给第一层)

数据为:ID          QTY         PID----------- ----------- -----------1           0           22        ...
  • htl258
  • htl258
  • 2009-07-09 19:10:00
  • 899

研发管理软件之高科技行业<em>BOM</em>结构树模板

研发管理软件之高科技行业<em>BOM</em>结构树模板,供大家一起参考学习。综合评分:0 收藏评论举报 所需: 3 积分/C币 下载个数: 65 开通VIP 立即下载 ...
  • 2018年04月14日 00:00

C# 基础入门代码 <em>BOM</em>开发

新手学习C#代码时写的<em>BOM</em>程序,供初学者学习。... 新手学习C#代码时写的<em>BOM</em>程序,供初学者学习。综合评分:3 收藏(3)评论(1)举报 所需: 3积分/C币 下载个数: ...
  • 2018年04月13日 00:00

BOM树形节点展开实例

------------------------------------------------------------------------------------ Author : htl258...
  • htl258
  • htl258
  • 2009-07-30 16:59:00
  • 1420

BOM和DOM详解

DOM是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口。,而BOM定义了JavaScript可以进行操作的浏览器的各个功能部件的接口。 js组成 我们都知道...
  • anythings
  • anythings
  • 2016-04-25 09:54:46
  • 6533
收藏助手
不良信息举报
您举报文章:用Oracle8的层次查询生成BOM树的实现方法
举报原因:
原因补充:

(最多只允许输入30个字)