不可不說(shuō)
          隨心所欲,無(wú)往不利!
          posts - 88,  comments - 92,  trackbacks - 0
          Oracle中Start with...Connect By實(shí)現(xiàn)部門多級(jí)遞歸理解及用法

          其基本語(yǔ)法是:

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

          簡(jiǎn)單說(shuō)來(lái)是將一個(gè)樹(shù)狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段: id,parentid,那么通過(guò)表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹(shù)狀結(jié)構(gòu)。用上述語(yǔ)法的查詢可以取得這棵樹(shù)的所有記錄。
          其中COND1是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹(shù)。
          COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說(shuō)上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄
          COND3是過(guò)濾條件,用于對(duì)返回的所有記錄進(jìn)行過(guò)濾

          例子:
          創(chuàng)建示例表:
          CREATE TABLE TBL_TEST
          (
          ID NUMBER,
          NAME VARCHAR2(100 BYTE),
          PID NUMBER DEFAULT 0
          );

          插入測(cè)試數(shù)據(jù):

          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往樹(shù)末梢遞歸(取所有點(diǎn))

          select * from TBL_TEST
          start with id=1
          connect by prior id = pid

          從末梢往樹(shù)ROOT遞歸(只取根結(jié)點(diǎn),根結(jié)點(diǎn)的根結(jié)點(diǎn)......)

          select * from TBL_TEST
          start with id=5
          connect by prior pid = id
          注:
          prior 寫在哪個(gè)字段那邊,那么就用start with 這條記錄的該項(xiàng)值 與 別的記錄的另一個(gè)字段的值去關(guān)聯(lián);
          start with 可以不寫,默認(rèn)為所有記錄

          例如
          select * from TBL_TEST
          start with id=5
          connect by prior pid = id
          因?yàn)閜id=2 與id=5 在本數(shù)據(jù)表中為同一條數(shù)據(jù), 因此可以理解為:

          select * from TBL_TEST
          start with pid=2
          connect by prior pid = id (個(gè)人認(rèn)為這樣更好理解)

           ****************************************************

          此語(yǔ)句可以直接分層次顯示

          SELECT lpad('|-',(level-1)*4,'|-')||lpad('『',2)||di_name||rpad('』',2)
          di_name,di_id
          FROM t_dictionary_link CONNECT BY PRIOR di_id=di_protypeid
          START WITH di_id=-1
          |-|-『公司架構(gòu)』                      2
          |-|-|-|-『芯碼科技』                  3
          |-|-|-|-|-|-『開(kāi)發(fā)部』                4
          |-|-|-|-|-|-|-|-『JAVA組』           11
          |-|-|-|-|-|-|-|-『.NET組』          102
          |-|-|-|-|-|-『銷售部』              261
          |-|-|-|-|-|-『客服部』    

          對(duì)各階層記錄排序使用
          ORDER SIBLINGS BY ID
          posted on 2010-05-23 23:02 藍(lán)劍 閱讀(1759) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle


          <2010年5月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(6)

          隨筆分類(62)

          隨筆檔案(90)

          文章檔案(9)

          相冊(cè)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 325305
          • 排名 - 172

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 盐源县| 卫辉市| 叶城县| 潜山县| 长阳| 海口市| 噶尔县| 望奎县| 抚顺县| 肥东县| 友谊县| 澳门| 尼玛县| 崇文区| 福贡县| 阳东县| 瑞金市| 长治市| 利川市| 荣成市| 乐东| 玛多县| 盐城市| 林周县| 延庆县| 兴宁市| 安西县| 桐城市| 沂南县| 四川省| 白水县| 日土县| 棋牌| 西乌| 阿拉尔市| 闻喜县| 迭部县| 彝良县| 花垣县| 曲水县| 长岛县|