首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 用Oracle8的层次查询生成BOM树的实现方法
【标  题】:用Oracle8的层次查询生成BOM树的实现方法
【关键字】:Oracle8,BOM
【来  源】:http://www.cublog.cn/u/28618/showart.php?id=233494

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

最近收到网友一个问题,关于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而不是伪列。实现原理同上面是一致的。
oracle RMAN快速指南:【上一篇】
codeset的问题:【下一篇】
【相关文章】
  • oracle8 备份与恢复(exp/imp)
  • 计算机中字符的Unicode编码,简要介绍UCS、UTF、BMP、BOM,字序等名词
  • oracle8i在redhat9的安装步骤
  • windows下无法安装oracle8i
  • Nuclear Bombs LinuX 06-10-19发布
  • 悬而未决:如何巧妙解决ERP中BOM的交叉问题
  • oracle8.1.7删除对象后出现失效对象无法编译生效的处理
  • redhat as4上安装oracle8.1.7全过程(一)
  • redhat as4上安装oracle8.1.7全过程(二)
  • redhat as4上安装oracle8.1.7全过程(三)
  • 【随机文章】
  • 差分约束系统
  • Linux系统下中文显示
  • 写一个通过多级http tunnel的小程序
  • Othello游戏源程序
  • pache+mysql+php
  • 一个小型的用于监视进程产生和撤销驱动逆向分析
  • 贪吃蛇的算法分析(5)
  • Support Tools Manager(STM)
  • Linux下的硬件驱动——USB设备(上)
  • Loading制作全攻略(全动画版)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.