Oracle 获取仅包含某些元素的递归树“;扩大的;

Oracle 获取仅包含某些元素的递归树“;扩大的;,oracle,recursion,Oracle,Recursion,我们有一个具有自引用树结构的表(id,parent\u id)。让我们假设以下树结构: + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 我想获取这些数据,以便在树中显示。但只有某些记录扩大了。我当前正在使用以下查询: SELECT ID, NAME "PATH" FROM GROUPS WHERE PRIOR ID IN(1, 4) CONNECT BY PARENT_ID = PRIOR

我们有一个具有自引用树结构的表(
id
parent\u id
)。让我们假设以下树结构:

+ 1
  + 2
  + 3
  + 4
    + 5
    + 6
    + 7
  + 8
+ 9
  + 10
  + 11
我想获取这些数据,以便在树中显示。但只有某些记录扩大了。我当前正在使用以下查询:

SELECT ID, NAME "PATH"
  FROM GROUPS
  WHERE PRIOR ID IN(1, 4)
  CONNECT BY PARENT_ID = PRIOR ID
  START WITH PARENT_ID IS NULL;
此操作非常有效,并返回以下记录:

+ 1
  + 2
  + 3
  + 4
    + 5
    + 6
    + 7
  + 8
+ 9
问题是,此查询将返回展开直接父级的每个记录,但不会返回整个父链。因此,如果我们只是扩展id
4
,记录
5、6、7
仍然不应该返回,因为
1
没有扩展

到目前为止,我一直在尝试获取一个自定义列,该列指示元素是否展开,它计算出元素是否显式展开以及父元素是否也展开

SELECT ...
CASE WHEN (ID IN (4) AND PRIOR EXPANDED = 1) THEN 1 ELSE 0 end "EXPANDED"
...
WHERE "EXPANDED" = 1
这不起作用,因为我既不能在WHERE语句中使用
展开的
别名,也不能在
先前展开的
语句中使用别名


有没有一种简单的方法可以通过简单的查询来实现这一点?

Oracle安装程序

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
查询--子句中的
已解释了所有父项

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
Query-
子句中,除了4和8之外,所有父级都已展开:

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
更新-显示叶节点

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 

1
表示节点没有子节点,
0
表示节点有子节点(即使它们可能未展开)。

Oracle设置

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
查询--
子句中的
已解释了所有父项

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
Query-
子句中,除了4和8之外,所有父级都已展开:

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
更新-显示叶节点

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 
输出

CREATE TABLE hierarchy ( id, parent_id ) AS
  SELECT 1, NULL FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 3, 2 FROM DUAL UNION ALL
  SELECT 4, 1 FROM DUAL UNION ALL
  SELECT 5, 4 FROM DUAL UNION ALL
  SELECT 6, 5 FROM DUAL UNION ALL
  SELECT 7, NULL FROM DUAL UNION ALL
  SELECT 8, 7 FROM DUAL UNION ALL
  SELECT 9, 8 FROM DUAL UNION ALL
  SELECT 10, 9 FROM DUAL UNION ALL
  SELECT 11, 8 FROM DUAL;
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 5, 7, 8, 9 );
+ 1
  + 2
    + 3
  +4
    + 5
      + 6
+ 7
  + 8
    + 9
      + 10
    + 11
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id
FROM   hierarchy
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 5, 7, 9 );
+ 1
  + 2
    + 3
  +4
+ 7
  + 8
SELECT LPAD( '+ ', LEVEL*2, ' ' ) || id AS value,
       isleaf
FROM   (
  -- Find the leaves first (as if all parents are expanded)
  SELECT h.*,
         CONNECT_BY_ISLEAF AS isLeaf
  FROM   hierarchy h
  START WITH parent_id IS NULL
  CONNECT BY PRIOR id = parent_id
)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
AND        parent_id IN ( 1, 2, 4, 7, 9 );
VALUE                ISLEAF
---------------- ----------
+ 1                       0 
  + 2                     0 
    + 3                   1 
  + 4                     0 
    + 5                   0 
+ 7                       0 
  + 8                     0 

1
表示节点没有子节点,
0
表示节点有子节点(即使它们可能没有展开)。

好的,刚才看到您关于要求展开整个父链的说明。下面使用sys\u connect\u by\u path来构建该链,然后检查它是否都是1(必须删除当前级别的最后一个节点):

通过1和4展开,您可以得到:

  WITH hier as (
  SELECT 1 id, NULL parent_id, 1 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null     ; 


LPAD('+',LVL*2,'')||ID 
+ 1                    
  + 2                  
  + 4                  
    + 5                
    + 6                
    + 7                
  + 8                  
  + 9       
WITH hier as (
  SELECT 1 id, NULL parent_id, 0 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null ;



    LPAD('+',LVL*2,'')||ID 
    + 1                    
更改为在节点1处取消展开,您将获得:

  WITH hier as (
  SELECT 1 id, NULL parent_id, 1 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null     ; 


LPAD('+',LVL*2,'')||ID 
+ 1                    
  + 2                  
  + 4                  
    + 5                
    + 6                
    + 7                
  + 8                  
  + 9       
WITH hier as (
  SELECT 1 id, NULL parent_id, 0 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null ;



    LPAD('+',LVL*2,'')||ID 
    + 1                    

好的,刚才看到了您关于要求扩展整个父链的说明。下面使用sys\u connect\u by\u path来构建该链,然后检查它是否都是1(必须删除当前级别的最后一个节点):

通过1和4展开,您可以得到:

  WITH hier as (
  SELECT 1 id, NULL parent_id, 1 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null     ; 


LPAD('+',LVL*2,'')||ID 
+ 1                    
  + 2                  
  + 4                  
    + 5                
    + 6                
    + 7                
  + 8                  
  + 9       
WITH hier as (
  SELECT 1 id, NULL parent_id, 0 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null ;



    LPAD('+',LVL*2,'')||ID 
    + 1                    
更改为在节点1处取消展开,您将获得:

  WITH hier as (
  SELECT 1 id, NULL parent_id, 1 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null     ; 


LPAD('+',LVL*2,'')||ID 
+ 1                    
  + 2                  
  + 4                  
    + 5                
    + 6                
    + 7                
  + 8                  
  + 9       
WITH hier as (
  SELECT 1 id, NULL parent_id, 0 expanded FROM DUAL UNION ALL
  SELECT 2, 1, 0 FROM DUAL UNION ALL
  SELECT 3, 2, 0 FROM DUAL UNION ALL
  SELECT 4, 1, 1 FROM DUAL UNION ALL
  SELECT 5, 4, 0 FROM DUAL UNION ALL
  SELECT 6, 4, 0 FROM DUAL UNION ALL
  SELECT 7, 4, 0 FROM DUAL UNION ALL
  SELECT 8, 1, 0 FROM DUAL UNION ALL
  SELECT 9, 1, 0 FROM DUAL UNION ALL
  SELECT 10, 9, 0 FROM DUAL UNION ALL
  SELECT 11, 9, 0 FROM DUAL )
SELECT LPAD( '+ ', lvl*2, ' ' ) || id
FROM (
      SELECT ID
           , parent_id 
           , level as lvl
           , sys_connect_by_path(expanded,'-')  as path_expanded 
        FROM hier
     CONNECT BY PARENT_ID = PRIOR ID
       START WITH PARENT_ID IS NULL
     )
WHERE --every node in the path from the parent is expanded.
     instr(substr(path_expanded,1,length(path_expanded)-2),'0') = 0
OR   parent_id is null ;



    LPAD('+',LVL*2,'')||ID 
    + 1                    

您是否试图扩展层次结构以仅显示一个ID及其兄弟姐妹、其祖先和这些祖先的兄弟姐妹?(反之,不显示后代和兄弟姐妹/祖先兄弟姐妹的后代)。是否只有一个元素(即,在您的示例中为4),或者可以在多个不相关的分支上扩展元素?是的,我想这就是我的目标。可以有多个扩展的、不相关的分支。可以将其视为普通树,用户可以在其中随意展开/折叠元素。仅通过应展开的节点ID列表进行展开。但是,用户很可能折叠包含展开子项的项。我目前的方法仍然显示这些孩子,但没有他们的父母(所以他们“挂”在无处)。谢谢你的帮助!更新了我的答案,以满足您对扩展整个父链的需求。抱歉-第一次错过了。您是否试图扩展层次结构以仅显示一个ID及其兄弟姐妹、其祖先和这些祖先的兄弟姐妹?(反之,不显示后代和兄弟姐妹/祖先兄弟姐妹的后代)。是否只有一个元素(即,在您的示例中为4),或者可以在多个不相关的分支上扩展元素?是的,我想这就是我的目标。可以有多个扩展的、不相关的分支。可以将其视为普通树,用户可以在其中随意展开/折叠元素。仅通过应展开的节点ID列表进行展开。但是,用户很可能折叠包含展开子项的项。我目前的方法仍然显示这些孩子,但没有他们的父母(所以他们“挂”在无处)。谢谢你的帮助!更新了我的答案,以满足您对扩展整个父链的需求。抱歉-第一次错过了。您如何扩展此查询以检查节点是否为叶?是否将叶计算为没有子节点或没有扩展的子节点?后者更容易,因为您只需将
CONNECT\u BY_ISLEAF
添加到所选列。因为根本没有子项。CONNECT\ U BY\ U ISLEAF在这里不起作用,因为它只考虑由CONNECT BY条件定义的树。@SanoJ请参阅我的更新-您需要一个内部查询,该查询将查找叶子,就像所有节点都已展开一样,然后是一个应用过滤器的外部查询。如何扩展此查询以检查节点是否为叶子?是否将叶子计算为没有叶子孩子还是没有孩子?后者更容易,因为您只需将
CONNECT\u BY_ISLEAF
添加到所选列。因为根本没有子项。CONNECT\u BY\u ISLEAF在这里不起作用,因为它只考虑由CONNECT BY条件定义的树。@SanoJ请参阅我的更新-您需要一个内部查询,该查询将查找叶子,就像所有节点都已展开一样,然后是一个应用过滤器的外部查询。