Oracle中關於樹遞迴的乙個sql分析

2021-09-01 08:18:22 字數 3473 閱讀 4363

總的:select distinct t.id tenantid,

t.name,

ts.scnames,

ts.scids,

t.remark

from pm_tenant t

inner join (select tenantid,

max(substr(scnames, 2)) scnames,--max取scname中包含的個數最多的;substr去第二個字元後面的字元

max(substr(scids, 2)) scids

from (select tenantid,

sys_connect_by_path(scnames, ',') scnames,

sys_connect_by_path(scids, ',') scids

from (select tenantid,

scnames,

scids,

tenantid || rn rchild,--字串連線

tenantid || (rn - 1) ***ther,rn

from (select ts.tenantid,

s.name scnames,

s.id scids,

row_number() over(partition by ts.tenantid order by ts.scid) rn --行序號:以tenenti為分界,不同則從0開始

from pm_tenant_sc ts

left join pm_servicecomponent s on ts.scid = s.id))

start with ***ther like '%0'--以父節點最後的字元為0的開始

connect by prior rchild = ***ther--prior 從父節點向下遍歷子節點

)group by tenantid) ts on t.id = ts.tenantid

下面來分析:

1:選出行號,不同tenentid,rn從頭算,相同tenantid,rn則遞增

select ts.tenantid,

s.name scnames,

s.id scids,

row_number() over(partition by ts.tenantid order by ts.scid) rn --行序號:以tenenti為分界,不同則從0開始

from pm_tenant_sc ts

left join pm_servicecomponent s on ts.scid = s.id

2:得到右孩子與父親,如10200--》10201--》10202:10200

---》coach(10201)

---》billy(10202)

select tenantid,

scnames,

scids,

tenantid || rn rchild,--字串連線(tenantid+rn-->rchild)

tenantid || (rn - 1) ***ther,rn--tenantid+rn-1-->***ther

from (select ts.tenantid,

s.name scnames,

s.id scids,

row_number() over(partition by ts.tenantid order by ts.scid) rn --行序號:以tenenti為分界,不同則從0開始

from pm_tenant_sc ts

left join pm_servicecomponent s on ts.scid = s.id)

3:形成樹,用逗號連線各個scnames,scids

select tenantid,

sys_connect_by_path(scnames, ',') scnames,

sys_connect_by_path(scids, ',') scids

from (select tenantid,

scnames,

scids,

tenantid || rn rchild,--字串連線

tenantid || (rn - 1) ***ther,rn

from (select ts.tenantid,

s.name scnames,

s.id scids,

row_number() over(partition by ts.tenantid order by ts.scid) rn --行序號:以tenenti為分界,不同則從0開始

from pm_tenant_sc ts

left join pm_servicecomponent s on ts.scid = s.id))

start with ***ther like '%0'--以父節點最後的字元為0的開始

connect by prior rchild = ***ther--prior 從父節點向下遍歷子節點

4:去掉前面的逗號,並且取scnames,scids最多的那項(去重複)

select tenantid,

max(substr(scnames, 2)) scnames,--max取scname中包含的個數最多的;substr去第二個字元後面的字元

max(substr(scids, 2)) scids

from (select tenantid,

sys_connect_by_path(scnames, ',') scnames,

sys_connect_by_path(scids, ',') scids

from (select tenantid,

scnames,

scids,

tenantid || rn rchild,--字串連線

tenantid || (rn - 1) ***ther,rn

from (select ts.tenantid,

s.name scnames,

s.id scids,

row_number() over(partition by ts.tenantid order by ts.scid) rn --行序號:以tenenti為分界,不同則從0開始

from pm_tenant_sc ts

left join pm_servicecomponent s on ts.scid = s.id))

start with ***ther like '%0'--以父節點最後的字元為0的開始

connect by prior rchild = ***ther--prior 從父節點向下遍歷子節點

)group by tenantid

乙個關於遞迴的演算法。

從鍵盤輸入乙個整數 1 20 則以該數字為矩陣的大小,把1,2,3 n n 的數字按照順時針螺旋的形式填入其中。例如 輸入數字2,則程式輸出 1 24 3輸入數字3,則程式輸出 1 2 3 8 9 4 7 6 5 輸入數字4,則程式輸出 1 2 3 4 12 13 14 5 11 16 15 6 1...

乙個關於更新Oracle中Blob問題

前幾天做專案,用到了oracle資料庫,是關於更新blob,是這樣寫的 描述 新增某張表某條記錄的content欄位,此字段為 blob 型 param 表名 主鍵 資料 資料庫連線 return 新增成功返回 true 否則返回 false public static boolean setblo...

利用遞迴形成乙個層級樹

在我們的開發中,很多時候在顯示乙個具有層級結構的下拉框,效果如下 輔助分類生成樹狀結構列表的工具類,名稱根據層級加字首 public class models2treeutil title walkcategorytreelist description 遍歷分類樹,把遍歷出的分類資訊放到指定的集合...