我在下面的格式中有一个层次表
CREATE TABLE tree_hierarchy (
id NUMBER (20)
,parent_id NUMBER (20)
);
INSERT INTO tree_hierarchy (id, parent_id) VALUES (2, 1);
INSERT INTO tree_hierarchy (id, parent_id) VALUES (4, 2);
INSERT INTO tree_hierarchy (id, parent_id) VALUES (9, 4);当我运行查询时:-
SELECT id,parent_id,
CONNECT_BY_ISLEAF leaf,
LEVEL,
SYS_CONNECT_BY_PATH(id, '/') Path,
SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path
FROM tree_hierarchy
WHERE CONNECT_BY_ISLEAF<>0
CONNECT BY PRIOR id = PARENT_id
ORDER SIBLINGS BY ID;我得到的结果如下:
"ID" "PARENT_ID" "LEAF" "LEVEL" "PATH" "PARENT_PATH"
9 4 1 3 "/2/4/9" "/1/2/4"
9 4 1 2 "/4/9" "/2/4"
9 4 1 1 "/9" "/4"但是我需要一个Oracle Sql查询,它只能得到以下内容
"ID" "PARENT_ID" "LEAF" "LEVEL" "PATH" "PARENT_PATH"
9 4 1 3 "/2/4/9" "/1/2/4"这是一个更简单的例子我有1000多条记录在这样的fashion.When中我运行了上面的查询,它生成了许多duplicates.Can任何一个给我一个通用的查询,它将给出从叶到根的完整路径,而不需要提前帮助duplicates.Thanks
发布于 2013-07-13 00:52:09
有限层次中的根节点必须始终是已知的。根据定义:http://en.wikipedia.org/wiki/Tree_structure根节点是没有父节点的节点。要检查给定节点是否为根节点,请使用"parent_id“并在表中检查是否存在具有此id的记录。查询可能如下所示:
SELECT id,parent_id,
CONNECT_BY_ISLEAF leaf,
LEVEL,
SYS_CONNECT_BY_PATH(id, '/') Path,
SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path
FROM tree_hierarchy th
WHERE CONNECT_BY_ISLEAF<>0
CONNECT BY PRIOR id = PARENT_id
START WITH not exists (
select 1 from tree_hierarchy th1
where th1.id = th.parent_id
)
ORDER SIBLINGS BY ID;发布于 2013-07-12 19:56:31
您应该明确地指出id来为其构建路径。现在,您的查询正在为满足条件的所有树叶构建路径。你需要使用"start with“让我们像这样试一试:
SELECT id,parent_id,
CONNECT_BY_ISLEAF leaf,
LEVEL,
SYS_CONNECT_BY_PATH(id, '/') Path,
SYS_CONNECT_BY_PATH(parent_id, '/') Parent_Path
FROM tree_hierarchy
WHERE CONNECT_BY_ISLEAF<>0
CONNECT BY PRIOR id = PARENT_id
START WITH id = 2
ORDER SIBLINGS BY ID;https://stackoverflow.com/questions/17613436
复制相似问题