为什么oracle SYS_CONNECT_BY_PATH返回空值?

时间:2015-07-08 21:04:00

标签: oracle hierarchical

为什么我的PATH列中充满了空值?分层数据中的循环是否会导致SYS_CONNECT_BY_PATH函数出现问题?

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE MODULES
(
    MOD_ID INTEGER NOT NULL,
    NAME VARCHAR2(20) NOT NULL,
    PRNT_MOD_ID INTEGER
 );

INSERT INTO  MODULES VALUES(1, 'BASE MODULE', 1);
INSERT INTO  MODULES VALUES(2, 'SUB MODULE 1-2', 1);
INSERT INTO  MODULES VALUES(3, 'SUB MODULE 1-3', 1);
INSERT INTO  MODULES VALUES(4, 'SUB MODULE 1-4', 1);
INSERT INTO  MODULES VALUES(5, 'SUB MODULE 1-2-5', 2);
INSERT INTO  MODULES VALUES(6, 'SUB MODULE 1-2-5-6', 5);

查询1

select t.mod_id,
       t.name,
       t.prnt_mod_id,
       max(LEVEL) as mx_lvl,
       SYS_CONNECT_BY_PATH(t.name, '>') as PATH
from MODULES t
start with t.mod_id = 1
connect by NOCYCLE prior t.mod_id = t.prnt_mod_id
group by t.mod_id, t.name, t.prnt_mod_id
order by mx_lvl, t.name

Results

| MOD_ID |               NAME | PRNT_MOD_ID | MX_LVL |   PATH |
|--------|--------------------|-------------|--------|--------|
|      1 |        BASE MODULE |           1 |      1 | (null) |
|      2 |     SUB MODULE 1-2 |           1 |      2 | (null) |
|      3 |     SUB MODULE 1-3 |           1 |      2 | (null) |
|      4 |     SUB MODULE 1-4 |           1 |      2 | (null) |
|      5 |   SUB MODULE 1-2-5 |           2 |      3 | (null) |
|      6 | SUB MODULE 1-2-5-6 |           5 |      4 | (null) |

我正在尝试使用SYS_CONNECT_BY_PATH,如oracle文档中所示:

http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52318 http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions171.htm#SQLRF06116

我真的想显示每个模块的分隔路径。

1 个答案:

答案 0 :(得分:1)

来自oracle documentation

  

如果指定[分层查询]子句,则不要指定ORDER BY或GROUP BY,因为它们会破坏CONNECT BY结果的层次结构顺序。如果要订购同一父节点的兄弟节点行,请使用ORDER SIBLINGS BY子句。

(如果你确实需要分组,那么在先前或后续的子查询中进行分组,但不要在同一个子查询中进行分组。)

要使用非空路径获取输出,可以执行以下操作:

SQL Fiddle

查询1

select t.mod_id,
       t.name,
       t.prnt_mod_id,
       LEVEL as mx_lvl,
       SYS_CONNECT_BY_PATH(t.name, '>') as PATH
from MODULES t
start with t.mod_id = 1
connect by NOCYCLE prior t.mod_id = t.prnt_mod_id
order by mx_lvl, t.name

<强> Results

| MOD_ID |               NAME | PRNT_MOD_ID | MX_LVL |                                                            PATH |
|--------|--------------------|-------------|--------|-----------------------------------------------------------------|
|      1 |        BASE MODULE |           1 |      1 |                                                    >BASE MODULE |
|      2 |     SUB MODULE 1-2 |           1 |      2 |                                     >BASE MODULE>SUB MODULE 1-2 |
|      3 |     SUB MODULE 1-3 |           1 |      2 |                                     >BASE MODULE>SUB MODULE 1-3 |
|      4 |     SUB MODULE 1-4 |           1 |      2 |                                     >BASE MODULE>SUB MODULE 1-4 |
|      5 |   SUB MODULE 1-2-5 |           2 |      3 |                    >BASE MODULE>SUB MODULE 1-2>SUB MODULE 1-2-5 |
|      6 | SUB MODULE 1-2-5-6 |           5 |      4 | >BASE MODULE>SUB MODULE 1-2>SUB MODULE 1-2-5>SUB MODULE 1-2-5-6 |

但是,您可能希望将其用作排序子句:

ORDER SIBLINGS BY t.name;