簡體   English   中英

Oracle 分層查詢數據

[英]Oracle hierarchical queries data

鏈接提供了一個很好的示例,用於概述如何使用 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聲明的Output

        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

圖表: 在此處輸入圖像描述

獲取所需 output 的 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM