此问题已在此处有答案:
Oracle XMLTable- fetching column from parent node(3个答案)
5天前关闭。
我有一个示例XML。
<a>
<b>
<id>1</id>
<comment-list>
<comment>
<value>asd</value>
</comment>
<comment>
<value>23</value>
</comment>
<comment>
<value>5436</value>
</comment>
<comment>
<value>123g</value>
</comment>
</comment-list>
</b>
<b>
<id>2</id>
<comment-list>
<comment>
<value>asd</value>
</comment>
<comment>
<value>23</value>
</comment>
<comment>
<value>5436</value>
</comment>
<comment>
<value>123g</value>
</comment>
</comment-list>
</b>
</a>
我想要的输出是
id comment
1 asd
1 23
1 5436
1 123g
2 asd
2 23
2 5436
2 123g
我尝试用xmltable实现:
SELECT *
FROM (
SELECT t1.*
FROM XMLTABLE
(
'//a/b'
PASSING xmltype(' <a>
<b>
<id>1</id>
<comment-list>
<comment>
<value>asd</value>
</comment>
<comment>
<value>23</value>
</comment>
<comment>
<value>5436</value>
</comment>
<comment>
<value>123g</value>
</comment>
</comment-list>
</b>
<b>
<id>2</id>
<comment-list>
<comment>
<value>asd</value>
</comment>
<comment>
<value>23</value>
</comment>
<comment>
<value>5436</value>
</comment>
<comment>
<value>123g</value>
</comment>
</comment-list>
</b>
</a>')
COLUMNS
id PATH 'id',
comment_list XMLTYPE PATH 'comment-list'
) t1
) t,
XMLTABLE
(
'//comment'
PASSING t.comment_list
COLUMNS
value PATH 'value'
) c
但是笛卡尔出现了。有人知道如何在1 SQL中实现它吗?我的第一个想法是用一个xmltable执行plsql循环,然后在循环中执行另一个循环。这很容易,但是在更大的xml中循环,这将是没有效率的。
有谁知道如何在1 SQL中解决它?
问候
2条答案
按热度按时间bmvo0sr51#
你可以使用
XMLTABLE
,为了得到id
,你可以使用..
返回元素层次结构:其中,对于样本数据:
输出:
| 通信| COMM |
| - -----| ------------ |
| ASD| asd |
| 二十三| 23 |
| 五四三六| 5436 |
| 123g| 123g |
| ASD| asd |
| 二十三| 23 |
| 五四三六| 5436 |
| 123g| 123g |
fiddle
imzjd6km2#
好吧,我错了。它真的有用。在我的xml是100 k字符,我没有注意到,一些id的出现超过-几个节点具有相同的id。
此SQl工作