亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

oracle分層查詢中的start with和connect by(樹

系統(tǒng) 3016 0
來源: ?http://blog.csdn.net/itmyhome1990/article/details/16338637
?
ORACLE是一個關(guān)系數(shù)據(jù)庫管理系統(tǒng),它用表的形式組織數(shù)據(jù),在某些表中的數(shù)據(jù)還呈現(xiàn)出樹型 結(jié)構(gòu)的聯(lián)系。
?例如有如下案例:
oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)

數(shù)據(jù)為節(jié)選,字段值含義分別為 稅務機構(gòu)代碼、稅務機構(gòu)名稱、上級稅務機構(gòu)代碼,稅務機構(gòu)級別
select * from extern_dm_swjg查詢的時候默認順序就是上面的順序,可以看出是混亂的并沒有特殊結(jié)構(gòu)特征。

而希望的結(jié)果如下圖:
oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)
sj_swjg_dm為空即根節(jié)點的排在第一個,仔細觀察 上圖是樹結(jié)構(gòu)查詢結(jié)果,可能不太直觀,看下圖就清楚了
oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)

1. 樹結(jié)構(gòu)的描述?
樹結(jié)構(gòu)的數(shù)據(jù)存放在表中,數(shù)據(jù)之間的層次關(guān)系即父子關(guān)系,通過表中的列與列間的關(guān)系來描述,
通過每個節(jié)點的父節(jié)點,就可以確定整個樹結(jié)構(gòu)。
在SELECT命令中使用CONNECT BY和START WITH 子句可以查詢表中的樹型結(jié)構(gòu)關(guān)系。其命令格式如下:
SELECT ...?
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}?
[START WITH]...?
其中: CONNECT BY子句說明每行數(shù)據(jù)將是按層次順序檢索 ,并規(guī)定將表中的數(shù)據(jù)連入樹型結(jié)構(gòu)的關(guān)系中。PRIORY運算符必須放置在連接關(guān)系的兩列中某一個的前面。對于節(jié)點間的父子關(guān)系,PRIOR運算符在的一側(cè)表示父節(jié)點,在另一側(cè)表示子節(jié)點, 從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是自底向上
START WITH 子句為可選項,用來標識哪個節(jié)點作為查找樹型結(jié)構(gòu)的根節(jié)點。若該子句被省略,則表示所有滿足查詢條件的行作為根節(jié)點。

例1?以樹結(jié)構(gòu)方式顯示表的數(shù)據(jù)。
  1. select?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. connect? by? prior?swjg_dm?=?sj_swjg_dm??
  4. start? with?sj_swjg_dm? is? null??

2. 關(guān)于PRIOR?
運算符PRIOR被放置于等號前后的位置,決定著查詢時的檢索順序。

例2從節(jié)點開始自底向上查詢
  1. select?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. connect? by??swjg_dm?=?? prior?sj_swjg_dm??
  4. start? with?swjg_dm?=? '16107100004'??

3.使用LEVEL?
??? 在具有樹結(jié)構(gòu)的表中,每一行數(shù)據(jù)都是樹結(jié)構(gòu)中的一個節(jié)點,由于節(jié)點所處的層次位置不同,所以每行記錄都可以有一個層號。層號根據(jù)節(jié)點與根節(jié)點的距離確定。不論從哪個節(jié)點開始,該起始根節(jié)點的層號始終為1,根節(jié)點的子節(jié)點為2, 依此類推。?
??? 在查詢中,可以使用偽列LEVEL顯示每行數(shù)據(jù)的有關(guān)層次。LEVEL將返回樹型結(jié)構(gòu)中當前節(jié)點的層次,我們可以使用LEVEL來控制對樹型結(jié)構(gòu)進行遍歷的深度。
?
例3 顯示表中的各行數(shù)據(jù)及層號。
  1. select? level,?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. connect? by? prior?swjg_dm?=?sj_swjg_dm??
  4. start? with?sj_swjg_dm? is? null??

偽列LEVEL為數(shù)值型,可以在SELECT 命令中用于各種計算。?

例4 使用LEVEL改變查詢結(jié)果的顯示形式。
  1. select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. connect? by? prior?swjg_dm?=?sj_swjg_dm??
  4. start? with?sj_swjg_dm? is? null???

在SELECT使用了函數(shù)LPAD,關(guān)于LPAD函數(shù)的使用,請參閱 Oracal的Lpad函數(shù)
4.節(jié)點和分支的裁剪?
??? 在對樹結(jié)構(gòu)進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用WHERE子句來限定樹型結(jié)構(gòu)中的單個節(jié)點,以去掉樹中的單個節(jié)點,但它卻不影響其后代節(jié)點(自頂向下檢索時)或前輩節(jié)點(自底向頂檢索時)。

例5 ?僅剪去了樹中單個節(jié)點16107100003?扶風縣國家稅務局
  1. select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. where?swjg_dm?!= '16107100003'??
  4. connect? by? prior?swjg_dm?=?sj_swjg_dm??
  5. start? with?sj_swjg_dm? is? null??
oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)
?在這個查詢中,僅剪去了樹中單個節(jié)點swjg_dm為16107100003的,可它的子節(jié)點依然存在。若希望剪去樹結(jié)構(gòu)中的某個分支,
?則要用CONNECT BY 子句。CONNECT BY 子句是限定樹型結(jié)構(gòu)中的整個分支,既要剪除分支上的單個節(jié)點,
?也要剪除其后代節(jié)點(自頂向下檢索時)或前輩節(jié)點(自底向頂檢索時)。

例6 ?除去節(jié)點16107100003的一支
  1. select?LPAD( LEVEL, LEVEL*3, '?')? as? "LEVEL",?swjg_dm,swjg_mc,sj_swjg_dm,swjg_level??
  2. from?extern_dm_swjg??
  3. connect? by? prior?swjg_dm?=?sj_swjg_dm??
  4. and?swjg_dm?!= '16107100003'??
  5. start? with?sj_swjg_dm? is? null??
oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)
? ? 這個查詢結(jié)果就與例5不同,除了剪去單個節(jié)點 16107100003?外,還將 16107100003?的子節(jié)點16107100004剪掉,即把 16107100003??這個分支剪掉了。?
??? 當然WHERE子句可以和CONNECT BY子句聯(lián)合使用,這樣能夠同時剪掉單個節(jié)點和樹中的某個分支。
?
在使用SELECT 語句來報告樹結(jié)構(gòu)報表時應當注意,CONNECT BY子句不能作用于出現(xiàn)在WHERE子句中的表連接。如果需要進行連接,可以先用樹結(jié)構(gòu)建立一個視圖,再將這個視圖與其他表連接,以完成所需要的查詢。

oracle分層查詢中的start with和connect by(樹結(jié)構(gòu)查詢)


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九九热这里 | 中文字字幕乱码视频 | 中文字幕第5页 | 国产精品福利资源在线 | 中文字幕久久综合 | 亚洲综合精品成人啪啪 | 未成人做爰视频www 我爱52avαv永久网站 | 久草在线视频首页 | 手机看片日韩高清国产欧美 | 欧美 日 | 久久久久女人精品毛片九一 | 久久国产精品高清一区二区三区 | 性www| 国产精品亚洲精品影院 | 亚洲一区二区精品 | 国产精品久久久久久久福利院 | 天天干夜夜操美女 | 99久久精品6在线播放 | 国产精品18久久久久久小说 | 毛片基地免费视频a | 在线免费观看国产精品 | 精品视频在线免费播放 | 欧美色大成网站www永久男同 | 亚洲图区综合 | 97视频在线视频 | 亚洲欧美在线视频免费 | 国产精品国产三级国产无毒 | 久久伊人成人网 | 亚洲三级在线免费观看 | 中文字幕热久久久久久久 | 亚洲精品欧美精品一区二区 | 欧美日韩高清一区二区三区 | 日韩天天干 | 国产精品久久久久久久久免费 | 亚洲天天网综合自拍图片专区 | 亚洲国产激情一区二区三区 | 精品毛片免费看 | 国产操女人 | 国产免费一区二区三区在线观看 | 欧美 亚洲 另类 热图 | 天天舔日日干 |