当前位置: 代码迷 >> Oracle开发 >> 求一条SQL怎么优化
  详细解决方案

求一条SQL怎么优化

热度:112   发布时间:2016-04-24 06:33:34.0
求一条SQL如何优化
项目有一个组织树,这颗组织树是权限树。
如下:
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>
  相关解决方案