用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而不是伪列。实现原理同上面是一致的。

 

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

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

SQL 与 orcale 数据库对BOM多级展开的实现方法

一、Oracle数据库 展开全部   文本: Oracle数据库 OracleERP  Oracle层次树查询 Oracle层次树是通过Connect by[条件] Start with [条...
  • mobiyue
  • mobiyue
  • 2014年05月07日 15:09
  • 3026

二叉树利用队列实现层次遍历

这里先提一句为什么之前树的创建可以由前序遍历的方法搞定,原因是前序遍历的时候把所有的空节点都包含在内了,如果仅仅只有非空节点的前序遍历输入,是无法得到单一二叉树的,例如给出了一个前序遍历顺序AB 那么...
  • lafengxiaoyu
  • lafengxiaoyu
  • 2016年11月20日 13:26
  • 5022

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

关于Oracle的层次查询的问题,发现Oracle 8i中一个非常有用的查询子句:select level,rowid,...  from ...  where ...  start with ......
  • dongdongdang
  • dongdongdang
  • 2011年04月29日 11:13
  • 375

UTF-8文件的BOM头的来由及去除方法

1. 什么是BOM头     在utf-8编码文件中BOM在文件头部,占用三个字节,用来标识该文件属于utf-8编码,现在已经有很多软件识别BOM头,但还是有些不能识别BOM头,比如PHP就不能识别...
  • esonbest1234
  • esonbest1234
  • 2016年02月24日 11:39
  • 5214

UTF-8文件头BOM的处理方法

UTF-8 BOM又叫UTF-8 签名,在UTF-8文件的头部,长度为3个字节。其实UTF-8 的BOM对UFT-8没有作用,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别。但是在...
  • findlymw
  • findlymw
  • 2014年05月16日 11:42
  • 973

删除uft-8文件bom头信息的方法

当我们保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),而(www.111cn.net)这个bom头可能导致一些不必要的问题,下面我整...
  • ninjya_luck
  • ninjya_luck
  • 2015年05月18日 14:48
  • 431

使用editplus等编程工具时UTF-8编码去掉BOM头方法(转载备查)

原文地址:http://www.dedecms8.com/db/php_bc/2928.html Unicode规范中有一个BOM...
  • rchm8519
  • rchm8519
  • 2015年05月05日 10:49
  • 3728

UTF-8 BOM可能导致样式错乱的解决方法

UTF-8 是一种在web应用中经常使用的一种 unicode 字符的编码方式,使用 UTF-8 的好处在于它是一种变长的编码方式,对于 ANSII 码编码长度为1个字节,这样的话在传输大量 ASCI...
  • zhzhi2008
  • zhzhi2008
  • 2014年03月10日 14:44
  • 1030

Java读带有BOM的UTF-8文件乱码原因及解决方法

最近项目配置文件使用ini文件,并且使用UTF-8编码,当使用微软编辑器修改后会出现java读取乱码问题。后经调试发现是微软在修改UTF-8格式文件时会在文件开始添加BOM,所以找到此解决方法。...
  • hemes1314
  • hemes1314
  • 2015年11月23日 15:22
  • 752
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Oracle8的层次查询生成BOM树的实现方法
举报原因:
原因补充:

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