我花了几天时间寻找以下问题的简单解决方案,我需要一些帮助。我有一个包含两列的 Oracle 表,recid(帐号)作为主键,xmlrecord 存储所有 xml 数据。我正在尝试使用 SQL 查询导出应用程序中具有多值项目的值。排除数据损坏,如果存在 c1 m="1",则始终会存在相应的 c2 m="1"和 c3 m="1",依此类推。该表太大,无法多次点击它来提取每个项目,因此我需要在一次访问该行时将它们全部从 xmlrecord 中提取出来。我尝试过内部联接 (1=1) 和 xmltables,但返回的数据或新行上的每个新匹配项总是以 NULL 结束。由于 xml 的结构,在这种情况下从顶层提取值对我不起作用
我们的基表数据结构:
RECID XMLRECORD
-----------------------------------
0000001 <row><c1>test</c1><c2>test2</c2>....</row>
0000002 <row><c1>test</c1><c2>test2</c2>....</row>
上述记录可以正常工作,因为没有多值字段。我遇到困难的是 XMLRecord 中存储的数据如下所示:
<row>
<c1>test1</c1>
<c1 m=1>test1_2</c1>
<c2>test2</c2>
<c2 m=1>test2_2</c2>
<c3>test3</c3>
<c3 m=1>test3_2</c3>
</row>
我想要的输出格式如下:
RECID Col1 Col2 Col3
-----------------------------------
0000003 test1 test2 test3
0000003 test1_2 test2_2 test3_2
0000004 test1 test2 test3
0000004 test1_2 test2_2 test3_2
最佳答案
谢谢大家的评论,但我已经通过构建适用于该实例的联接设法获得了我需要的解决方案。它的好处是,无论供应商向我们扔了多少记录,它都会起作用。在某些情况下,“m”属性最多可达 9 或 10。
我在 (1=1) 上使用了通常的内部联接,并基于动态 ID 构建了后续联接。 第一行的 ID_NUM 结果是“c”,下一行是“c2”,依此类推。
SELECT
t.recid
,t2.VALUE1
,t3.VALUE2
,t4.VALUE3
FROM t
INNER JOIN XMLTABLE('/row/c1'
PASSING t.xmlrecord
ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
VALUE1 VARCHAR(20) path '.') t2
ON (1=1)
INNER JOIN XMLTABLE('/row/c2'
PASSING t.xmlrecord
ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
VALUE2 VARCHAR(20) path '.') t3
ON (t2.ID_NUM=t3.ID_NUM)
INNER JOIN XMLTABLE('/row/c3'
PASSING t.xmlrecord
ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
VALUE3 VARCHAR(20) path '.') t4
ON (t2.ID_NUM=t4.ID_NUM)
关于sql - Oracle SQL 从多个元素中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21218510/