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