ID1,org_name,org_id ,parent_org_id
ID2,org_name,org_id ,parent_org_id
变为
ID1 org_id1, org_name1,org_id2,org_name2,org_id3, org_name3...
ID2 org_id1, org_name1,org_id2,org_name2,org_id3, org_name3...
将自己部门的完整信息用一条记录显示。
--------------------------------------------------------------------
SELECT
T.ID,
CONNECT_BY_ISLEAF , --是否为最叶子节点
CONNECT_BY_ROOT T.NODENAME, --根节点节点名字
LTRIM(SYS_CONNECT_BY_PATH(T.NODENAME,'-'),'-'), --连接各节点
LEVEL --层
FROM TREETEST T
START WITH FATHERID IS NULL --选择根节点
CONNECT BY PRIOR ID=FATHERID --prior在前,表示从根节点开始遍历,CONNECT BY ID=PRIOR FATHERID表示从叶子节点开始遍历
ORDER BY T.ID
--------------------------------------------------------------------
第一步,将完整路径拼接到一起
( SELECT org_id,
org_name,
LTRIM (SYS_CONNECT_BY_PATH (org_name, '->'), '->')
org_tree_path,
LEVEL treelevel
FROM sys_org
START WITH org_id = 0
CONNECT BY PRIOR org_id = parent_org_id)
第二步,拆分完整路径,分配到各个字段(这里取5层为例)
/* Formatted on 2011-11-21 15:40:49 (QP5 v5.114.809.3010) */
CREATE OR REPLACE FORCE VIEW AICS.V_OPER_ORG_TREE
(
OP_ID,
TREELEVEL,
ORG_NAME_1,
ORG_NAME_2,
ORG_NAME_3,
ORG_NAME_4,
ORG_NAME_5
)
AS
SELECT a.op_id,
treelevel,
CASE treelevel
WHEN 1
THEN
org_tree_path
ELSE
SUBSTR (org_tree_path, 1, INSTR (org_tree_path, '->') - 1)
END
org_name_1,
CASE treelevel
WHEN 1
THEN
NULL
WHEN 2
THEN
SUBSTR (org_tree_path, INSTR (org_tree_path, '->') + 2)
ELSE
SUBSTR (org_tree_path,
INSTR (org_tree_path, '->') + 2,
INSTR (org_tree_path,
'->',
1,
2)
- INSTR (org_tree_path, '->')
- 2)
END
org_name_2,
CASE treelevel
WHEN 1
THEN
NULL
WHEN 2
THEN
NULL
WHEN 3
THEN
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
2)
+ 2)
ELSE
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
2)
+ 2, INSTR (org_tree_path,
'->',
1,
3)
- INSTR (org_tree_path,
'->',
1,
2)
- 2)
END
org_name_3,
CASE treelevel
WHEN 1
THEN
NULL
WHEN 2
THEN
NULL
WHEN 3
THEN
NULL
WHEN 4
THEN
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
3)
+ 2)
ELSE
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
3)
+ 2, INSTR (org_tree_path,
'->',
1,
4)
- INSTR (org_tree_path,
'->',
1,
3)
- 2)
END
org_name_4,
CASE treelevel
WHEN 1
THEN
NULL
WHEN 2
THEN
NULL
WHEN 3
THEN
NULL
WHEN 4
THEN
NULL
WHEN 5
THEN
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
4)
+ 2)
ELSE
SUBSTR (org_tree_path, INSTR (org_tree_path,
'->',
1,
4)
+ 2, INSTR (org_tree_path,
'->',
1,
5)
- INSTR (org_tree_path,
'->',
1,
4)
- 2)
END
org_name_5
FROM sys_oper a,
( SELECT org_id,
org_name,
LTRIM (SYS_CONNECT_BY_PATH (org_name, '->'), '->')
org_tree_path,
LEVEL treelevel
FROM sys_org
START WITH org_id = 0
CONNECT BY PRIOR org_id = parent_org_id) b
WHERE a.org_id = b.org_id;
---------------------------------------------------------------------------------------------------------
SELECT
T.ID,
CONNECT_BY_ISLEAF , --是否为最叶子节点
CONNECT_BY_ROOT T.NODENAME, --根节点节点名字
LTRIM(SYS_CONNECT_BY_PATH(T.NODENAME,'-'),'-'), --连接各节点
LEVEL --层
FROM TREETEST T
START WITH FATHERID IS NULL --选择根节点
CONNECT BY PRIOR ID=FATHERID --prior在前,表示从根节点开始遍历,CONNECT BY ID=PRIOR FATHERID表示从叶子节点开始遍历
ORDER BY T.ID