【问题标题】:Oracle multi-hierarchical query [duplicate]Oracle多层次查询[重复]
【发布时间】:2017-04-27 12:28:28
【问题描述】:

我在不同的范围 (102,103,...) 中有几个逗号分隔的列表 (A,B,..):

SCOPE_ID  LIST_NAME  LIST_OF_NODES
102       list_A     02086,02087,02089,02131,02210,02211
102       list_B     00004,06003,06338
103       list_A     00705,02006,02017,02057,02085
103       list_B     09442,09443
...

我需要一个格式的表格:

SCOPE_ID  LIST_NAME NODE_ID
102       list_A    02086
102       list_A    02087
102       list_B    00004
...
103       list_A    00705
103       list_A    02006
103       list_B    09442
...

我已经知道如何用逗号分隔 LIST_OF_NODES:

select SCOPE_ID, LIST_NAME, NODE_ID, 
       substr(NODE_ID,instr(NODE_ID,',',1,decode(level-1,0,1,level-1))-5,5) node 
from (
  select '102' SCOPE_ID, 
         'LIST_A' LIST_NAME, 
         '00705,02006,02017,02057,02085,02086,02087,02089,02131,02210,02211' NODE_ID 
    from dual ) 
connect by level<=regexp_count(NODE_ID,',')+2 ;

...但是如何为多个列表和范围做呢?

【问题讨论】:

    标签: sql oracle recursion recursive-query connect-by


    【解决方案1】:

    如果您能够为单个记录创建查询
    (顺便说一句 - 你的查询是错误的,我已经稍微完善了它)

    With my_table AS(
      select '102' SCOPE_ID, 'LIST_A' LIST_NAME, 
               '00705,02006,02017,02057,02085,02086,02087,02089,02131,02210,02211' NODE_ID 
      from dual 
    )
    
    
    SELECT SCOPE_ID, LIST_NAME, NODE_ID, 
           substr(NODE_ID,instr(NODE_ID,',',1,decode(level ,0,1,level ))-5,5) node 
    FROM my_table
    connect by level<=regexp_count(NODE_ID,',')+1 ;
    

    那么您可以使用LATERAL 关键字对多条记录运行此查询,方式如下:

    With my_table AS(
      select '102' SCOPE_ID, 'LIST_A' LIST_NAME, '00705,02006,02017,02057,02085,02086,02087,02089,02131,02210,02211' NODE_ID 
      from dual UNION ALL
      select '102' SCOPE_ID, 'LIST_B' LIST_NAME, '00004,06003,06338' NODE_ID 
      from dual UNION ALL 
      select '103' SCOPE_ID, 'LIST_A' LIST_NAME, '00705,02006,02017,02057,02085' NODE_ID 
      from dual
    )
    
    
    SELECT x.SCOPE_ID, x.LIST_NAME, x.node_id, y.NODE 
    FROM my_table x,
    LATERAL  (
        SELECT x.NODE_ID, 
               substr(x.NODE_ID,instr(x.NODE_ID,',',1,decode(level ,0,1,level ))-5,5) node 
        FROM dual
        connect by level<=regexp_count(x.NODE_ID,',')+1
    ) y
    

    【讨论】:

    • LATERAL 从 12c 开始可用,我在 11g 上工作,但是感谢您的回答。
    猜你喜欢
    • 2020-04-17
    • 2015-10-15
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2018-02-03
    相关资源
    最近更新 更多