0

EAV スキーマに格納される階層を持つ XML 構造があり、parent_id 列を持つ階層を格納するテーブルの 1 つがあります。この例のように、レベルには複数の要素を含めることができます

このように並べるよりも、階層を処理するためのより良い方法はありますか? この場合、階層レベルの数に制限があると思いますが、これは正しくないようです。

with x as (select xmltype('
 <data>  
   <row level="1a">
         <row level="1a2a">         
           <row level="1a2a3a"/> 
           <row level="1a2a3b"/> 
         </row>
         <row level="1a2b">         
           <row level="1a2b3a"/> 
           <row level="1a2b3b"/> 
         </row>
     </row>
     <row level="2a">
          <row level="2a1a">
               <row level="2a1a3a"/>
               <row level="2a1a3b"/>
        </row>
     </row>
     </data>') as xml from dual)
  select t1.l1, t2.l2, t3.l3
  from   x
        ,xmltable('/data/row'
                  passing x.xml
                  columns l1 varchar(20) path './@level'
                         , l2x xmltype  path './row'
                 ) t1
           ,xmltable('./row'
                  passing t1.l2x
                  columns l2 varchar2(20) path './@level'
                        , l3x xmltype  path './row'                           
                 ) t2
           ,xmltable('./row'
                  passing t2.l3x
                  columns l3 varchar2(20) path './@level'
                 ) t3                
4

1 に答える 1

0

もう少し洗練された XQuery で可能です。

with x as (
  select xmltype('
    <data>  
      <row level="1a">
        <row level="1a2a">         
          <row level="1a2a3a"/> 
          <row level="1a2a3b"/> 
        </row>
        <row level="1a2b">         
          <row level="1a2b3a"/> 
          <row level="1a2b3b"/> 
        </row>
     </row>
     <row level="2a">
        <row level="2a1a">
           <row level="2a1a3a"/>
           <row level="2a1a3b"/>
        </row>
     </row>
   </data>'
  ) as xml from dual
)
select 
  h.level_id, 
  h.parent_id
from 
  x,
  xmltable(
    '               
      for $i in $doc//row  
      let $j := $i/..
      return <res>
               <lvl>{data($i/@level)}</lvl>
               <prnt>{data($j/@level)}</prnt>
             </res>
    '
    passing x.xml as "doc"
    columns 
      level_id  varchar2(100) path '//lvl',
      parent_id varchar2(100) path '//prnt'
  ) h
于 2014-05-21T18:04:16.887 に答える