悟心

          成功不是將來才有的,而是從決定去做的那一刻起,持續(xù)累積而成。 上人生的旅途罷。前途很遠,也很暗。然而不要怕。不怕的人的面前才有路。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            93 隨筆 :: 1 文章 :: 103 評論 :: 0 Trackbacks
          Start withConnect By子句遞歸查詢一般用于一個表維護樹形結構的應用。
          創(chuàng)建示例表:
          CREATE TABLE TBL_TEST
          (
            ID    
          NUMBER,
            NAME  
          VARCHAR2(100 BYTE),
            PID   
          NUMBER                                  DEFAULT 0
          );
           
          插入測試數據:
          INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
          INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
          INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
          INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
          INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
           
          從Root往樹末梢遞歸
          select * from TBL_TEST
           start 
          with id=1
           connect 
          by prior id = pid
           
          從末梢往樹ROOT遞歸
          select * from TBL_TEST
           start 
          with id=5
           connect 
          by prior pid = id
          =====
          對于oracle進行簡單樹查詢(遞歸查詢)

          DEPTID PAREDEPTID NAME 
          NUMBER NUMBER CHAR (40 Byte) 
          部門id 父部門id(所屬部門id) 部門名稱 


          通過子節(jié)點向根節(jié)點追朔.

          Sql代碼 
          1.select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid   
          Sql代碼  
          1.select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid   
           
          select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid  

          通過根節(jié)點遍歷子節(jié)點. 

          Sql代碼 
          1.select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid   
          Sql代碼  
          1.select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid   
          select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid  

          可通過level 關鍵字查詢所在層次. 

          Sql代碼 
          1.select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid   
          Sql代碼  
          1.select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid   
          select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid  

          再次復習一下:start 
          with connect by 的用法, start with 后面所跟的就是就是遞歸的種子。 

          遞歸的種子也就是遞歸開始的地方 connect 
          by 后面的"prior" 如果缺省:則只能查詢到符合條件的起始行,并不進行遞歸查詢; 

          connect 
          by prior 后面所放的字段是有關系的,它指明了查詢的方向。 

          練習: 通過子節(jié)點獲得頂節(jié)點 

          Sql代碼 
          1.select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid  
          ====這種方法只是當表里就有一顆樹,多棵樹怎么辦?

          .聲明:JavaEye文章版權屬于作者,受法律保護。沒有作者書面許可不得轉載。 
          posted on 2011-03-16 11:30 艾波 閱讀(715) 評論(0)  編輯  收藏 所屬分類: SQL
          主站蜘蛛池模板: 阿拉善左旗| 神木县| 韶山市| 视频| 喀什市| 阿城市| 博乐市| 长泰县| 苍梧县| 天峨县| 佛冈县| 花垣县| 隆安县| 阜南县| 休宁县| 台南县| 绿春县| 宜城市| 肇源县| 辽中县| 米林县| 内黄县| 桃园市| 舞阳县| 平利县| 胶州市| 沙雅县| 虎林市| 双峰县| 施甸县| 吴桥县| 随州市| 和平区| 宜黄县| 自治县| 曲沃县| 牡丹江市| 锡林郭勒盟| 溧阳市| 逊克县| 沛县|