我有一个XML结构,它有一个层次结构,它将存储在EAV模式中,其中一个表使用parent_id列存储层次结构。级别可以包含多个元素,如下例所示
有没有更好的方法来处理层次结构,而不是像这样串起来呢?在这种情况下,我认为分层级别的数量是有限制的,但这似乎是不正确的:
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 发布于 2014-05-22 02:04:17
使用稍微复杂一点的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'
) hhttps://stackoverflow.com/questions/23789173
复制相似问题