成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Oracle樹查詢及相關(guān)函數(shù)

Oracle樹查詢的最重要的就是select...start with... connect by ...prior 語法了。依托于該語法,我們可以將一個表形結(jié)構(gòu)的中以樹的順序列出來。在下面列述了Oracle中樹型查詢的常用查詢方式以及經(jīng)常使用的與樹查詢相關(guān)的Oracle特性函數(shù)等,在這里只涉及到一張表中的樹查詢方式而不涉及多表中的關(guān)聯(lián)等。

創(chuàng)新互聯(lián)專注于滄縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供滄縣營銷型網(wǎng)站建設(shè),滄縣網(wǎng)站制作、滄縣網(wǎng)頁設(shè)計、滄縣網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造滄縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供滄縣網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

列表結(jié)構(gòu)如下:

Oracle樹查詢及相關(guān)函數(shù)

PID存儲的是父ID,如果是頂級父節(jié)點,該PID為0(表中最好別有null記錄,這會引起全文掃描,建議改成0代替)。

我們從最基本的操作,逐步列出樹查詢中常見的操作,所以查詢出來的節(jié)點以家族中的輩份作比方。

1. 查找樹中的所有頂級父節(jié)點(輩份最長的人)。

假設(shè)這個樹是個目錄結(jié)構(gòu),那么第一個操作總是找出所有的頂級節(jié)點,再根據(jù)該節(jié)點找到其下屬節(jié)點。

SELECT * FROM TREEDATA WHERE PID = 0;

這是個引子,沒用到樹型查詢。

2.查找一個節(jié)點的直屬子節(jié)點(所有兒子)。

如果查找的是直屬子類節(jié)點,也是不用用到樹型查詢的。

SELECT * FROM TREEDATA WHERE PID = 1;

這個可以找到ID為1的直屬子類節(jié)點。

3.查找一個節(jié)點的所有 直屬子節(jié)點(所有后代)。

SELECT * FROM TREEDATA START WITH ID = 1 CONNECT BY PID = PRIOR ID;

這個查找的是ID為1的節(jié)點下的所有直屬子類節(jié)點,包括子輩的和孫子輩的所有直屬節(jié)點。

4.查找一個節(jié)點的直屬父節(jié)點(父親)。

如果查找的是節(jié)點的直屬父節(jié)點,也是不用用到樹型查詢的。

SELECT b.* FROM TREEDATA a JOIN TREEDATA b ON a.PID = b.ID WHERE a.ID = 1;

這個找到的是ID為1的節(jié)點的直屬父節(jié)點,要用到同一張表的關(guān)聯(lián)了。

5.查找一個節(jié)點的所有直屬父節(jié)點(祖宗)。

SELECT * FROM TREEDATA START WITH ID = 1 CONNECT BY PRIOR PID = ID;

這里查找的就是ID為1的所有直屬父節(jié)點,打個比方就是找到一個人的父親、祖父等。但是值得注意的是這個查詢出來的結(jié)果的順序是先列出子類節(jié)點再列出父類節(jié)點,姑且認為是個倒序吧。

上面列出兩個樹型查詢方式,第3條語句和第5條語句,這兩條語句之間的區(qū)別在于prior關(guān)鍵字的位置不同,所以決定了查詢的方式不同。 當PID= PRIOR ID時,數(shù)據(jù)庫會根據(jù)當前的ID迭代出PID與該ID相同的記錄,所以查詢的結(jié)果是迭代出了所有的子類記錄;而PRIOR ID = PID時,數(shù)據(jù)庫會跟據(jù)當前的PID來迭代出與當前的PID相同的ID的記錄,所以查詢出來的結(jié)果就是所有的父類結(jié)果。

以下是一系列針對樹結(jié)構(gòu)的更深層次的查詢,這里的查詢不一定是最優(yōu)的查詢方式,或許只是其中的一種實現(xiàn)而已。

6.查詢一個節(jié)點的兄弟節(jié)點(親兄弟)。

Oracle樹查詢及相關(guān)函數(shù)

這里查詢的就是與ID為1的節(jié)點同屬一個父節(jié)點的節(jié)點了,就好比親兄弟了。

7.查詢與一個節(jié)點同級的節(jié)點(族兄弟)。

Oracle樹查詢及相關(guān)函數(shù)

這里使用兩個技巧,一個是使用了LEVEL來標識每個節(jié)點在表中的級別,還有就是使用with語法模擬出了一張帶有級別的臨時表。

8.查詢一個節(jié)點的父節(jié)點的的兄弟節(jié)點(伯父與叔父)。

Oracle樹查詢及相關(guān)函數(shù)

這里查詢分成以下幾步。首先,將第7個一樣,將全表都使用臨時表加上級別;其次,根據(jù)級別來判斷有幾種類型,以上文中舉的例子來說,有三種情況:(1)當前節(jié)點為頂級節(jié)點,即查詢出來的lev值為1,那么它沒有上級節(jié)點,不予考慮。(2)當前節(jié)點為2級節(jié)點,查詢出來的lev值為2,那么就只要保證lev級別為1的就是其上級節(jié)點的兄弟節(jié)點。(3)其它情況就是3以及以上級別,那么就要選查詢出來其上級的上級節(jié)點(祖父),再來判斷祖父的下級節(jié)點都是屬于該節(jié)點的上級節(jié)點的兄弟節(jié)點。 最后,就是使用UNION將查詢出來的結(jié)果進行結(jié)合起來,形成結(jié)果集。

9.查詢一個節(jié)點的父節(jié)點的同級節(jié)點(族叔)。

這個其實跟第7種情況是相同的。

Oracle樹查詢及相關(guān)函數(shù)

只需要做個級別判斷就成了。

基本上,常見的查詢在里面了,不常見的也有部分了。其中,查詢的內(nèi)容都是節(jié)點的基本信息,都是數(shù)據(jù)表中的基本字段,但是在樹查詢中還有些特殊需求,是對查詢數(shù)據(jù)進行了處理的,常見的包括列出樹路徑等。

補充一個概念,對于數(shù)據(jù)庫來說,根節(jié)點并不一定是在數(shù)據(jù)庫中設(shè)計的頂級節(jié)點,對于數(shù)據(jù)庫來說,根節(jié)點就是start with開始的地方。

下面列出的是一些與樹相關(guān)的特殊需求。

10.名稱要列出名稱全部路徑。

這里常見的有兩種情況,一種是是從頂級列出,直到當前節(jié)點的名稱(或者其它屬性);一種是從當前節(jié)點列出,直到頂級節(jié)點的名稱(或其它屬性)。舉地址為例:國內(nèi)的習(xí)慣是從省開始、到市、到縣、到居委會的,而國外的習(xí)慣正好相反。

從頂部開始:

Oracle樹查詢及相關(guān)函數(shù)

從當前節(jié)點開始:

Oracle樹查詢及相關(guān)函數(shù)

在這里我又不得不放個牢騷了。oracle只提供了一個sys_connect_by_path函數(shù),卻忘了字符串的連接的順序。在上面的例子中,第一個SQL是從根節(jié)點開始遍歷,而第二個SQL是直接找到當前節(jié)點,從效率上來說已經(jīng)是千差萬別,更關(guān)鍵的是第一個SQL只能選擇一個節(jié)點,而第二個SQL卻是遍歷出了一顆樹來。再次PS一下。

sys_connect_by_path函數(shù)就是從start with開始的地方開始遍歷,并記下其遍歷到的節(jié)點,start with開始的地方被視為根節(jié)點,將遍歷到的路徑根據(jù)函數(shù)中的分隔符,組成一個新的字符串,這個功能還是很強大的。

11.列出當前節(jié)點的根節(jié)點。

在前面說過,根節(jié)點就是start with開始的地方。

Oracle樹查詢及相關(guān)函數(shù)

connect_by_root函數(shù)用來列的前面,記錄的是當前節(jié)點的根節(jié)點的內(nèi)容。

12.列出當前節(jié)點是否為葉子。

這個比較常見,尤其在動態(tài)目錄中,在查出的內(nèi)容是否還有下級節(jié)點時,這個函數(shù)是很適用的。

Oracle樹查詢及相關(guān)函數(shù)

connect_by_isleaf函數(shù)用來判斷當前節(jié)點是否包含下級節(jié)點,如果包含的話,說明不是葉子節(jié)點,這里返回0;反之,如果不包含下級節(jié)點,這里返回1。

文章名稱:Oracle樹查詢及相關(guān)函數(shù)
分享URL:http://jinyejixie.com/article10/gdjgdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、定制網(wǎng)站、移動網(wǎng)站建設(shè)、搜索引擎優(yōu)化、服務(wù)器托管、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)
万源市| 侯马市| 磴口县| 承德县| 五台县| 罗城| 察雅县| 宁强县| 丽江市| 云龙县| 张家界市| 福鼎市| 通许县| 平乡县| 临夏县| 资源县| 司法| 安溪县| 简阳市| 梁河县| 景宁| 新绛县| 徐州市| 新野县| 沁阳市| 崇州市| 广东省| 罗山县| 铁岭县| 敖汉旗| 轮台县| 沧源| 通化市| 安泽县| 红河县| 比如县| 海南省| 东宁县| 通州区| 台前县| 镇原县|