国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

用Oracle8的層次查詢生成BOM樹的實現方法

2024-08-29 13:42:08
字體:
來源:轉載
供稿:網友
最近收到網友一個問題,關于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是非常方便的,只要循環所有記錄就可以輕松實現了。
  效果
  
用Oracle8的層次查詢生成BOM樹的實現方法


  在Sybase,MS SQL Server中不知有沒有這樣的語法,我不是太清楚,假如您知道,請告訴我。
  
  現在我在MS SQL Server中的實現是這樣的:
  加入字段level而不是偽列。實現原理同上面是一致的。
    

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰溪市| 宜兴市| 吉木萨尔县| 博罗县| 鸡泽县| 沁阳市| 桑日县| 雷山县| 滨州市| 莱芜市| 双柏县| 荥经县| 云阳县| 当雄县| 金湖县| 永宁县| 德令哈市| 中西区| 文登市| 迁安市| 霍林郭勒市| 临高县| 枣阳市| 济南市| 宁城县| 灵台县| 车致| 纳雍县| 义乌市| 偃师市| 正安县| 胶州市| 华安县| 汉川市| 萨嘎县| 肥东县| 庆安县| 囊谦县| 乌拉特前旗| 依兰县| 延长县|