项目有一个组织树,这颗组织树是权限树。
如下:
A___B
|___C___D
| ___E
数据存储如下
节点 父节点
A -1
B A
C A
D C
E C
通过sys_connect_by_path获得如下表
节点 路径
A /A
B /A/B
C /A/C
D /A/C/D
E /A/C/E
但我想获得的数据是
节点 上级
A A
B A
B B
C A
C C
D A
D C
D D
E A
E C
E E
我现在的写法是用sys_connect_by_path生成的path 再like 树节点id做出来的,查询出的速度是0.1秒,速度能够接受,但对于只有400条数据组织的树,我觉得速度比较慢,且此数据表会成为基础表,用于过滤。有没有像sys_connect_by_path一样的函数能够一次性的查询出数据的或由更好的写法
我的查询方法
SELECT v.row_id, b.row_id right_id
FROM (SELECT row_id, sys_connect_by_path(row_id, '#') path
FROM md_org_unit a
WHERE a.unit_type1_id IS NOT NULL
START WITH parent_id = '-1'
CONNECT BY PRIOR row_id = parent_id) v
LEFT JOIN md_org_unit b
ON b.unit_type1_id IS NOT NULL
AND v.path LIKE '%' || b.row_id || '%';
------解决思路----------------------
解决了吗?代码帮你写完测试了下,没啥问题
SQL> with T AS(
2 SELECT 'A' ID,'-1' PID FROM DUAL UNION ALL
3 SELECT 'B' ID,'A' PID FROM DUAL UNION ALL
4 SELECT 'C' ID,'A' PID FROM DUAL UNION ALL
5 SELECT 'D' ID,'C' PID FROM DUAL UNION ALL
6 SELECT 'E' ID,'C' PID FROM DUAL)
7 SELECT CONNECT_BY_ROOT(ID) ROOT,ID
8 FROM T
9 CONNECT BY PRIOR PID=ID
10 ORDER BY ROOT,LEVEL DESC;
R I
- -
A A
B A
B B
C A
C C
D A
D C
D D
E A
E C
E E
已选择11行。
SQL>