为什么我的PATH列中充满了空值?分层数据中的循环是否会导致SYS_CONNECT_BY_PATH函数出现问题?
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
我真的想显示每个模块的分隔路径。
答案 0 :(得分:1)
如果指定[分层查询]子句,则不要指定ORDER BY或GROUP BY,因为它们会破坏CONNECT BY结果的层次结构顺序。如果要订购同一父节点的兄弟节点行,请使用ORDER SIBLINGS BY子句。
(如果你确实需要分组,那么在先前或后续的子查询中进行分组,但不要在同一个子查询中进行分组。)
要使用非空路径获取输出,可以执行以下操作:
查询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;