Oracle樹 sql
假設有資料表結構如下,只有葉子節點有資料:
1 | id parentId name amount |
2 | 1 成本 |
3 | 2 1 工資 |
4 | 3 2 基本工資 1000 |
5 | 4 2 獎金 200 |
6 | 5 1 保險 400 |
現在想統計處父節點合計數 ,如下:
1 | id name amount |
2 | 1 成本 1600 //2 + 5 |
3 | 2 工資 1200 //3 + 4 |
4 | 3 基本工資 1000 |
5 | 4 獎金 200 |
6 | 5 保險 400 |
使用CTE語法構建臨時表如下:
1 | with tmp as ( |
2 | select 1 as id , null as parentid , '成本' as name , null as amount from dual union all |
3 | select 2,1 , '工資', null from dual union all |
4 | select 3,2 , '基本工資', 1000 from dual union all |
5 | select 4,2 , '獎金' , 200 from dual union all |
6 | select 5,1 , '保險' , 400 from dual |
7 | ) |
8 | select * from tmp; |
1 | ID PARENTID NAME AMOUNT |
2 | ---------------------- ---------------------- -------- ---------------------- |
3 | 1 成本 |
4 | 2 1 工資 |
5 | 3 2 基本工資 1000 |
6 | 4 2 獎金 200 |
7 | 5 1 保險 400 |
解法一:
1 | select root_id,root_name,sum(amount) from (select connect_by_root(id) root_id,connect_by_root(name) root_name,amount from tmp where connect_by_isleaf=1 connectby prior id = parentid) group by root_id,root_name order by root_id; |
解法二(使用內查詢方式):
1 | select id,parentid,name, (select sum(amount) from tmp a start with a.id=b.id connect by prior a.id=a.parentid ) sum_sal from tmp b order by 1; |
基本思路都是利用 connect by 子句自根節點/分支節點往葉子結點搜尋,找出不同的根節點/分支節點到葉子節點的路徑再求和,修改一下解法一的子查詢並檢視一下結果集:
1 | select connect_by_root(id) start_id,id leaf_id,amount from tmp where connect_by_isleaf=1 connect by prior id = parentid; |
01 | START_ID LEAF_ID AMOUNT |
02 | ---------- ---------- ---------- |
03 | 1 3 1000 |
04 | 1 4 200 |
05 | 1 5 400 |
06 | 2 3 1000 |
07 | 2 4 200 |
08 | 3 3 1000 |
09 | 4 4 200 |
10 | 5 5 400 |
start_id 就是開始查詢(不是start with)的節點id,leaf_id就是葉子節點的id,可以看到id=1的節點,也就是根節點的值等於三個葉子節點的值的總和,葉子節點的值是明確的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3090/viewspace-703846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中顯示阻塞樹的SQLOracleSQL
- 【PL/SQL】Oracle--樹的使用(Connect By)SQLOracle
- Related to Oracle SQL 關於樹形資料的遍歷OracleSQL
- oracle樹的裁剪Oracle
- oracle 樹查詢Oracle
- 【SQL】Oracle SQL monitorSQLOracle
- SQL in ORACLE and SQL ServerSQLOracleServer
- oracle樹形查詢Oracle
- 一個樹形聚集SQL問題SQL
- SQL Story(十一)--樹狀表遊戲 (轉)SQL遊戲
- oracle樹中prior的用法Oracle
- Oracle中的B樹索引Oracle索引
- Oracle如何建立B樹索引Oracle索引
- ORACLE TOP SQLOracleSQL
- Oracle 常用SQLOracleSQL
- oracle SQL with 子句OracleSQL
- Oracle SQL JOINOracleSQL
- first oracle sqlOracleSQL
- Oracle SQL optimizationOracleSQL
- Oracle PL/SQLOracleSQL
- 【Oracle】--PL/SQL匯入Oracle sql指令碼"傻瓜教程"OracleSQL指令碼
- [Oracle]Oracle良性SQL建議OracleSQL
- 一個樹形聚集SQL問題(二)SQL
- 樹的層次體現的sql方案SQL
- 【SQL】Oracle SQL處理的流程SQLOracle
- 【SQL】Oracle SQL共享池檢查SQLOracle
- ORACLE SQL and SQL*PLUS (strong recommend)OracleSQL
- Oracle如何實現B樹索引Oracle索引
- oracle樹形選單查詢Oracle
- Oracle SQL處理OracleSQL
- Oracle SQL Model ClauseOracleSQL
- [ORACLE] SQL執行OracleSQL
- ORACLE SQL PROFILE使用OracleSQL
- [Oracle Script] Top sqlOracleSQL
- Oracle PL/SQL INDICESOracleSQL
- oracle sql優化OracleSQL優化
- oracle PL/SQL示例OracleSQL
- Oracle sql trace用法OracleSQL