sql - 从 Oracle 中的 CONNECT-BY 查询中删除重复的子树

标签 sql database oracle

我有一个格式为

的分层表
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 条这样的记录。当我运行上面的查询时,它会生成很多重复项。任何人都可以给我一个通用查询,它会给出从叶到根的完整路径而没有重复。提前感谢您的帮助

最佳答案

有限层次结构中的根节点必须始终是已知的。 根据定义: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;

关于sql - 从 Oracle 中的 CONNECT-BY 查询中删除重复的子树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17613436/

相关文章:

c# - 如何获取数据计数并使用 SQL 对其进行分类?

php - 在Codeigniter中: How to get url if i clicked on the fetched data from database

oracle - 在 INSERT 查询中使用主键的顺序值

oracle - 当 "PARTITION LIST SUBQUERY"位于执行计划中时,某些东西(错误?)会取消实例化包

sql - 在哪里可以获得/阅读SQL标准SQL:2011?

mysql - 如果记录存在于多个表中则更新 SQL 查询

sql - 加快从另一个表更新

Android 数据库设计,使用 SQLite 或直接使用 mySQL 和 JSON

database - 当 MS Access 用作前端而 PostgreSQL 用作后端时,如何隐藏/锁定链接的 PostgreSQL 表?

sql - 执行计划不如预期