【问题标题】:Convert adjacency list to enumeration path ORACLE将邻接表转换为枚举路径ORACLE
【发布时间】:2022-01-16 07:30:46
【问题描述】:

如何在 Oracle 中创建一个将邻接列表转换为枚举路径的过程(通过创建一个新表作为枚举路径)?邻接表是一个如下所示的表:

AdjList(id number, parent_id number, name varchar2)

ID PARENT_ID  NAME
-----------------------------
1             CATEGORY1
2    1        PROD1
3             CATEGORY2
4    3        PROD2
5    4        SUBPROD1

期望的输出:

EnumPath(id number, parent_id number, name varchar2, path varchar2)

ID PARENT_ID  NAME          PATH
-----------------------------------
1             CATEGORY1     /1/
2    1        PROD1         /1/2/
3             CATEGORY2     /3/
4    3        PROD2         /3/4/
5    4        SUBPROD1      /3/4/5/

【问题讨论】:

  • 请提供示例数据和所需的输出。
  • @Littlefoot 我添加了更多规格。

标签: sql oracle oracle-sqldeveloper enumeration adjacency-list


【解决方案1】:

没有数据很难说,但如果你有类似的数据

ID    PARENT_ID    NAME
1     NULL         TOP
2     1            L2
3     2            L3
4     3            BOTTOM

你正在寻找类似的东西

TOP -> L2 -> L3 -> BOTTOM

您可以使用诸如

之类的查询
SELECT LISTAGG(NAME, ' -> ') WITHIN GROUP(ORDER BY LEVEL) AS PATH
  FROM ADJLIST
  CONNECT BY PARENT_ID = PRIOR ID
  START WITH ID = (SELECT ID FROM ADJLIST WHERE PARENT_ID IS NULL)

db<>fiddle here

【讨论】:

  • @Anaidm:获取示例查询并对其进行修改以获得所需的输出。
  • 但是如果我有更多的父 id 为空(根)怎么办?另外,我想知道每条记录的路径。
  • SELECT LISTAGG(ID, ' -&gt; ') WITHIN GROUP(ORDER BY LEVEL) AS PATH FROM ADJLIST CONNECT BY PARENT_ID = PRIOR ID START WITH ID IS NULL 它给了我空的路径。
  • ID 永远不会为 NULL。
【解决方案2】:

在我看来,这就像一个 sys_connect_by_path 分层查询。

SQL> with test (id, parent_id, name) as
  2    (select 1, null, 'category1' from dual union all
  3     select 2, 1   , 'prod1' from dual union all
  4     select 3, null, 'category2' from dual union all
  5     select 4, 3   , 'prod2' from dual union all
  6     select 5, 4   , 'subprod1' from dual
  7    )
  8  select id, parent_id, name,
  9    ltrim(sys_connect_by_path(id, '>'), '>') path
 10  from test
 11  connect by prior id = parent_id
 12  start with parent_id is null;

        ID  PARENT_ID NAME      PATH
---------- ---------- --------- --------------------
         1            category1 1
         2          1 prod1     1>2
         3            category2 3
         4          3 prod2     3>4
         5          4 subprod1  3>4>5

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多