Oracle分层查询数据

Posted

技术标签:

【中文标题】Oracle分层查询数据【英文标题】:Oracle hierarchical queries data 【发布时间】:2021-03-05 04:03:56 【问题描述】:

link 提供了一个很好的示例来概述如何使用 Oracle 分层查询。我试图使用链接中给出的示例表tab1 生成以下数据组合,但持续了一段时间。使用 Oracle 版本 12.2

PARENT_ID    CHILD_ID
--------    ---------
       1      2         # the root node and id combination (This is evident by using ROOT_ID,ID)
       1      3
       1      4
       .      .
       .      .
       2      5         # How to generate below combination in a select statement ont TAB1 table.
       2      6
       .      .
       .      .
       9     11
SELECT id,
       parent_id,
       RPAD('.', (level-1)*2, '.') || id AS tree,
       level,
       CONNECT_BY_ROOT id AS root_id,
       LTRIM(SYS_CONNECT_BY_PATH(id, '-'), '-') AS path,
       CONNECT_BY_ISLEAF AS leaf
FROM   tab1
START WITH parent_id IS NULL
CONNECT BY parent_id = PRIOR id
ORDER SIBLINGS BY id;

上述select语句的输出

        ID  PARENT_ID TREE                      LEVEL    ROOT_ID PATH                       LEAF
---------- ---------- -------------------- ---------- ---------- -------------------- ----------
         1            1                             1          1 1                             0
         2          1 ..2                           2          1 1-2                           0
         3          2 ....3                         3          1 1-2-3                         1
         4          2 ....4                         3          1 1-2-4                         0
         5          4 ......5                       4          1 1-2-4-5                       1
         6          4 ......6                       4          1 1-2-4-6                       1
         7          1 ..7                           2          1 1-7                           0
         8          7 ....8                         3          1 1-7-8                         1
         9          1 ..9                           2          1 1-9                           0
        10          9 ....10                        3          1 1-9-10                        0
        11         10 ......11                      4          1 1-9-10-11                     1
        12          9 ....12                        3          1 1-9-12                        1

图表:

【问题讨论】:

您遇到了什么问题? 试图在 tab1 表上找出一条选择语句,该语句将给出路径组合中显示的所有组合(父子)的输出,如 2-5,2-6 和 9-11。 我想你的问题已经在这里回答了***.com/questions/38461843/…你能检查一下吗? 该案例似乎没有回答如何获取2-5,2-6和9-11等节点的部分。这就像在图中找到所有可能的子节点和父节点组合一样。 感谢@KoenLostrie 指出问题。通过对那里给出的答案进行一些调整,我可以获得所需的结果。 【参考方案1】:

获取所需输出的 ​​sql 查询如下:

解决方案 1:使用 CTE

with h ( id, parent_id ) as (
       select id ,parent_id  from tab1
     ),
     r ( id  , parent_id, steps ) as (
       select id  , id    , 0    
       from   h
       union all
       select r.id, h.parent_id, steps + 1
       from   h join r
                on h.id = r.parent_id
     ) 
select    parent_id, id
from     r
where    parent_id != id
order by parent_id asc;

解决方案 2:使用 Oracle 仅通过查询连接。 CONNECT BY NOCYCLE 子句可用于不遍历循环层次结构(如果有)。

with hier_data as
(
select 
       connect_by_root id as parent_id
       ,id
    from tab1
connect by parent_id = prior id
order by parent_id,id
)
select * from hier_data 
where
parent_id != id;

【讨论】:

以上是关于Oracle分层查询数据的主要内容,如果未能解决你的问题,请参考以下文章

具有多个父级的 Oracle 分层查询

Oracle 分层查询

oracle ebs r12报告的Oracle flex值层次结构SQL查询

如何使用分层子查询构建层次结构路径

有没办法在postgreSQL中查询oracle上的数据

优化分层数据集以读取整个层次结构