總的: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 遍歷分類樹,把遍歷出的分類資訊放到指定的集合...