Hopes

          Start Here..

           

          用select 語句中的START WITH...CONNECT BY PRIOR子句實(shí)現(xiàn)遞歸查詢

          今天發(fā)現(xiàn)在oracle中的select語句可以用START WITH...CONNECT BY PRIOR子句實(shí)現(xiàn)遞歸查詢,connect by 是結(jié)構(gòu)化查詢中用到的,其基本語法是: 

          select ... from tablename start with cond1 
          connect by cond2 
          where cond3; 

          簡單說來是將一個(gè)樹狀結(jié)構(gòu)存儲在一張表里,比如一個(gè)表中存在兩個(gè)字段: 
          id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個(gè)樹狀結(jié)構(gòu)。 

          用上述語法的查詢可以取得這棵樹的所有記錄。 

          其中COND1是根結(jié)點(diǎn)的限定語句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。 

          COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。 

          COND3是過濾條件,用于對返回的所有記錄進(jìn)行過濾。

           應(yīng)用實(shí)例:三張表聯(lián)合查詢建樹

          區(qū)域 學(xué)校 關(guān)系

           create table schoolarea( node number, fnode number, text varchar2(10) )
          insert into schoolarea values(1,0591,'福州一中');
          insert into schoolarea values(2,0591,'福州三中');
          insert into schoolarea values(3,0591,'師大附中');

          學(xué)校 年級 關(guān)系
          create table schoolteam( node number, fnode number, text varchar2(10) )
          insert into schoolteam values(11,1,'高一');
          insert into schoolteam values(12,1,'高三');--注意這個(gè)順序
          insert into schoolteam values(13,1,'高二');--注意這個(gè)順序
          insert into schoolteam values(21,2,'高一');
          insert into schoolteam values(22,2,'高二');
          insert into schoolteam values(23,2,'高三');
          insert into schoolteam values(31,3,'高一');
          insert into schoolteam values(32,3,'高二');
          insert into schoolteam values(33,3,'高三');
          年級 班級 關(guān)系
          create table teamclass( node number, fnode number, text varchar2(10) )
          insert into teamclass values(101,11,'(1)班');
          insert into teamclass values(102,11,'(2)班');
          insert into teamclass values(103,12,'(1)班');
          insert into teamclass values(104,12,'(2)班');
          insert into teamclass values(105,13,'(1)班');
          insert into teamclass values(106,13,'(2)班');
          insert into teamclass values(201,21,'(1)班');
          insert into teamclass values(202,21,'(2)班');
          insert into teamclass values(203,22,'(1)班');
          insert into teamclass values(204,22,'(2)班');
          insert into teamclass values(205,23,'(1)班');
          insert into teamclass values(206,23,'(2)班');
          insert into teamclass values(301,31,'(1)班');
          insert into teamclass values(302,31,'(2)班');
          insert into teamclass values(303,32,'(1)班');
          insert into teamclass values(304,32,'(2)班');
          insert into teamclass values(305,33,'(1)班');
          insert into teamclass values(306,33,'(2)班');
          查詢語句
          SQL code
          select * from(
          select * from schoolarea union
          select * from schoolteam union
          select * from teamclass )m
          start
          with m.fnode=591 connect by prior m.node=fnode

          查詢結(jié)果:
          1 1 591 福州一中
          2 11 1 高一
          3 101 11 (1)班
          4 102 11 (2)班
          5 12 1 高三 --
          6 103 12 (1)班
          7 104 12 (2)班
          8 13 1 高二 --
          9 105 13 (1)班
          10 106 13 (2)班
          11 2 591 福州三中
          12 21 2 高一
          13 201 21 (1)班
          14 202 21 (2)班
          15 22 2 高二
          16 203 22 (1)班
          17 204 22 (2)班
          18 23 2 高三
          19 205 23 (1)班
          20 206 23 (2)班
          21 3 591 師大附中

          對于oracle進(jìn)行簡單樹查詢(遞歸查詢)

          DEPTIDPAREDEPTIDNAME
          NUMBERNUMBERCHAR (40 Byte)
          部門id父部門id(所屬部門id)部門名稱

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

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

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

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

           

          可通過level 關(guān)鍵字查詢所在層次.

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

          再次復(fù)習(xí)一下:start with ...connect by 的用法, start with 后面所跟的就是就是遞歸的種子。

          遞歸的種子也就是遞歸開始的地方 connect by 后面的"prior" 如果缺?。簞t只能查詢到符合條件的起始行,并不進(jìn)行遞歸查詢;

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

          練習(xí): 通過子節(jié)點(diǎn)獲得頂節(jié)點(diǎn)

          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  

          posted on 2012-05-10 16:32 ** 閱讀(342) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 麻城市| 灵台县| 浦江县| 陆川县| 名山县| 石台县| 云林县| 伊金霍洛旗| 襄樊市| 瑞金市| 阳江市| 玛沁县| 贞丰县| 洛浦县| 屏东市| 琼结县| 绵阳市| 临朐县| 浑源县| 宁河县| 库尔勒市| 河东区| 玉溪市| 福鼎市| 建德市| 竹北市| 杂多县| 新蔡县| 嘉义市| 栖霞市| 房产| 积石山| 马山县| 敦煌市| 台北县| 霍山县| 剑阁县| 松潘县| 巴南区| 金乡县| 陆川县|