首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLTABLE到关系层次结构

XMLTABLE到关系层次结构
EN

Stack Overflow用户
提问于 2014-05-22 00:40:10
回答 1查看 656关注 0票数 0

我有一个XML结构,它有一个层次结构,它将存储在EAV模式中,其中一个表使用parent_id列存储层次结构。级别可以包含多个元素,如下例所示

有没有更好的方法来处理层次结构,而不是像这样串起来呢?在这种情况下,我认为分层级别的数量是有限制的,但这似乎是不正确的:

代码语言:javascript
复制
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                
EN

回答 1

Stack Overflow用户

发布于 2014-05-22 02:04:17

使用稍微复杂一点的XQuery也是可能的:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23789173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档