首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从oracle中的CONNECT-BY查询中删除重复的子树

从oracle中的CONNECT-BY查询中删除重复的子树
EN

Stack Overflow用户
提问于 2013-07-12 19:00:53
回答 2查看 9.5K关注 0票数 7

我在下面的格式中有一个层次表

代码语言:javascript
复制
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);

当我运行查询时:-

代码语言:javascript
复制
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;

我得到的结果如下:

代码语言:javascript
复制
"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查询,它只能得到以下内容

代码语言:javascript
复制
"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

EN

回答 2

Stack Overflow用户

发布于 2013-07-13 00:52:09

有限层次中的根节点必须始终是已知的。根据定义:http://en.wikipedia.org/wiki/Tree_structure根节点是没有父节点的节点。要检查给定节点是否为根节点,请使用"parent_id“并在表中检查是否存在具有此id的记录。查询可能如下所示:

代码语言:javascript
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2013-07-12 19:56:31

您应该明确地指出id来为其构建路径。现在,您的查询正在为满足条件的所有树叶构建路径。你需要使用"start with“让我们像这样试一试:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17613436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档