Oracle 多层次查询

Oracle multi-hierarchical query

我有几个不同范围 (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
...

我需要获取 table 格式:

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 ;

...但是如何针对多个列表和范围执行此操作?

如果您能够为单个记录创建查询
(顺便说一下 - 你的查询是错误的,我稍微提炼了一下)

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