Oracle 樹查詢及相關函式

2021-08-30 12:14:48 字數 2128 閱讀 8982

oracle樹查詢的最重要的就是select...start with... connect by ...prior 語法了。依託於該語法,我們可以將乙個表形結構的中以樹的順序列出來。

parent_id儲存的是上級id,如果是頂級父節點,該parent_id為0

[quote]表中最好別有null記錄,這會引起全文掃瞄,建議使用0代替[/quote]

1. 查詢樹中的所有頂級父節點

select * from security_res_category where parent_id=0

[img]

2.查詢乙個節點的直屬子節點(所有兒子)

select * from security_res_category where parent_id=361

[img]

3.查詢乙個節點的所有 直屬子節點(所有後代)

[img]

4.查詢乙個節點的直屬父節點(父親)

select b.* from security_res_category a join security_res_category b on a.parent_id = b.id where a.id = 261;

[img]

5.查詢乙個節點的所有直屬父節點(祖宗)

select * from security_res_category start with id = 363 connect by prior parent_id = id;

[img]

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

上面列出兩個樹型查詢方式,第3條語句和第5條語句,這兩條語句之間的區別在於prior關鍵字的位置不同,所以決定了查詢的方式不同。

當parent_id=prior id時,資料庫會根據當前的id迭代出parent_id與該id相同的記錄,所以查詢的結果是迭代出了所有的子類記錄;而prior id=parent_id時,資料庫會跟據當前的parent_id來迭代出與當前的parent_id相同的id的記錄,所以查詢出來的結果就是所有的父類結果。

以下是一系列針對樹結構的更深層次的查詢,這裡的查詢不一定是最優的查詢方式,或許只是其中的一種實現而已。

6.查詢乙個節點的兄弟節點(親兄弟)

select * from security_res_category where parent_id=

(select parent_id from security_res_category where id=363)

[img]

7.名稱要列出名稱全部路徑

select sys_connect_by_path (mc, '/')  

from security_res_category

where id = 6498

start with parent_id=0

connect by parent_id = prior id

[img]

11.列出當前節點的根節點

select connect_by_root name, security_res_category.*  

from security_res_category where id=363

start with parent_id=0

connect by prior id = parent_id;

[img]

12.列出當前節點是否為葉子

select connect_by_isleaf, security_res_category.*  

from security_res_category where id=963

start with parent_id=0

connect by parent_id = prior id;

[img]

Oracle 查詢相關函式

decode 條件,值1,返回值1,值2,返回值2,值n,返回值n,預設值 1 比較大小 select decode sign 變數1 變數2 1,變數1,變數2 from dual sign 函式根據某個值是0 正數還是負數,分別返回0 1 1 2 select sum decode 性別,男,1...

oracle函式相關

1.nvl oracle的nvl函式的用法 通過查詢獲得某個欄位的合計值,如果這個值位null將給出乙個預設的預設值 select nvl sum t.dwxhl 1 from tb jhde t where zydm 1 這裡關心的nvl的用法,nvl arg,value 代表如果前面的arg的值...

oracle相關函式

大寫的ps oracle儲存過程測試進不去解決方案 重新編譯 trunc sysdate,d 1 表示今天所在周的周一的年月日,如今天是2016.04.21周四,則trunc sysdate,d 1表示2016.04.18周一 select trunc sysdate from dual case ...