2016-12-12 11 views
0

私はいくつかのカンマが異なるスコープ内のリスト(A、B、...)(102103、...)区切り持っている:私はフォーマットのテーブルを取得する必要がありますOracleの多階層問合せ

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 ; 

...しかし、複数のリストとスコープのためにそれを行うにはどのように?

答えて

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 
+0

12cから入手可能ですが、私は11gで作業しますが、回答はありがとうございます。 –

関連する問題