Oracle:自连接XMLTable输出
我试图将一些XML解析到WITH子句中的一个表中,然后在主查询中将该表连接到它自己。然而,我没有得到任何记录,即使只有一个最小的测试用例 以下是示例xml:Oracle:自连接XMLTable输出,oracle,common-table-expression,self-join,xmltable,Oracle,Common Table Expression,Self Join,Xmltable,我试图将一些XML解析到WITH子句中的一个表中,然后在主查询中将该表连接到它自己。然而,我没有得到任何记录,即使只有一个最小的测试用例 以下是示例xml: <xml> <entry timestamp="20170330100429" effective="20170329"> <field name="Name"> <ov> <![CDATA[Fran]]> </ov> <
<xml>
<entry timestamp="20170330100429" effective="20170329">
<field name="Name">
<ov> <![CDATA[Fran]]> </ov>
<nv> <![CDATA[Frank]]> </nv>
</field>
<field name="Zip">
<ov> <![CDATA[13583]]> </ov>
<nv> <![CDATA[13853]]> </nv>
</field>
</entry>
<entry timestamp="20170401094783" effective="20170331">
<field name="MI">
<ov> <![CDATA[J]]> </ov>
<nv> <![CDATA[A]]> </nv>
</field>
<field name="Suffix">
<ov> <![CDATA[Jr]]> </ov>
<nv> <![CDATA[III]]> </nv>
</field>
</entry>
</xml>
如果相反,我使用以下任一选项:
select * from HRH h1, HRH h2
select * from HRH h1 join HRH h2 on 1=1
我收到一条错误消息:
Line Pos Text
==== === ================================================
17 23 ORA-19032: Expected XML tag , got no content
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
==== === ================================================
我怎样才能让它工作?我的总体目标是为我的数据集获取给定xml\u id字段组合的最新更新。不太清楚为什么会出现这种行为;具体化第一个CTE会停止错误,但随后找不到任何数据 不直接相关,但您可以将查询简化为一个XMLTable调用,至少对于所显示的数据是如此:
SELECT au.xml_id,
x.tran_ts as chg_timestr,
to_date(substr(x.tran_ts, 0, 8), 'yyyymmdd') chg_date,
cast(substr(x.tran_ts, 9, 6) as int) chg_time,
x.fieldname,
x.ov old_value,
x.nv new_value
FROM myxml au
CROSS JOIN xmltable('/xml/entry/field'
PASSING XMLTYPE(au.x)
COLUMNS tran_ts VARCHAR2(16) PATH './../@timestamp',
fieldname VARCHAR2(250) PATH '@name',
nv VARCHAR2(250) PATH 'nv',
ov VARCHAR2(250) PATH 'ov'
) x;
XML_ID CHG_TIMESTR CHG_DATE CHG_TIME FIELDNAME OLD_VALUE NEW_VALUE
---------- ---------------- ---------- ---------- ---------- ---------- ----------
1 20170330100429 2017-03-30 100429 Name Fran Frank
1 20170330100429 2017-03-30 100429 Zip 13583 13853
1 20170401094783 2017-04-01 94783 MI J A
1 20170401094783 2017-04-01 94783 Suffix Jr III
正在尝试获取数据的自联接,但存在大量空值。也很奇怪
但是,即使您的实际查询过于复杂,无法完成您说过的功能,毕竟,您说过目标是获取最新的更新,您可以使用:
with myxml as
(
select /*+ materialize */ 1 xml_id,
'<xml> <entry timestamp="20170330100429" effective="20170329"> <field name="Name"> <ov><![CDATA[Fran]]></ov> <nv><![CDATA[Frank]]></nv> </field> <field name="Zip"> <ov><![CDATA[13583]]></ov> <nv><![CDATA[13853]]></nv> </field> </entry> <entry timestamp="20170401094783" effective="20170331"> <field name="MI"> <ov><![CDATA[J]]></ov> <nv><![CDATA[A]]></nv> </field> <field name="Suffix"> <ov><![CDATA[Jr]]></ov> <nv><![CDATA[III]]></nv> </field> </entry> </xml>' x from dual
),
HRH as
(
SELECT au.xml_id,
x.tran_ts as chg_timestr,
to_date(substr(x.tran_ts, 0, 8), 'yyyymmdd') chg_date,
cast(substr(x.tran_ts, 9, 6) as int) chg_time,
x.fieldname,
x.ov old_value,
x.nv new_value,
rank() over (partition by au.xml_id, x.fieldname
order by x.tran_ts desc) rnk
FROM myxml au
CROSS JOIN xmltable('/xml/entry/field'
PASSING XMLTYPE(au.x)
COLUMNS tran_ts VARCHAR2(16) PATH './../@timestamp',
fieldname VARCHAR2(250) PATH '@name',
nv VARCHAR2(250) PATH 'nv',
ov VARCHAR2(250) PATH 'ov'
) x
)
select * from HRH
where rnk = 1;
对于每个ID/字段,您只有一组数据,这些数据将为您提供与示例相同的结果,但如果有多个ID/字段,则应为您提供每个ID/字段的最新数据。您还应该查看秩和稠密秩分析函数之间的差异,并确定您希望看到的是数据中是否存在联系-如果可能的话。我不确定我的查询出了什么问题,但您的两个查询都有效,并且允许我执行自联接,尽管我将使用您给出的第二个查询,并且不再需要它。
SELECT au.xml_id,
x.tran_ts as chg_timestr,
to_date(substr(x.tran_ts, 0, 8), 'yyyymmdd') chg_date,
cast(substr(x.tran_ts, 9, 6) as int) chg_time,
x.fieldname,
x.ov old_value,
x.nv new_value
FROM myxml au
CROSS JOIN xmltable('/xml/entry/field'
PASSING XMLTYPE(au.x)
COLUMNS tran_ts VARCHAR2(16) PATH './../@timestamp',
fieldname VARCHAR2(250) PATH '@name',
nv VARCHAR2(250) PATH 'nv',
ov VARCHAR2(250) PATH 'ov'
) x;
XML_ID CHG_TIMESTR CHG_DATE CHG_TIME FIELDNAME OLD_VALUE NEW_VALUE
---------- ---------------- ---------- ---------- ---------- ---------- ----------
1 20170330100429 2017-03-30 100429 Name Fran Frank
1 20170330100429 2017-03-30 100429 Zip 13583 13853
1 20170401094783 2017-04-01 94783 MI J A
1 20170401094783 2017-04-01 94783 Suffix Jr III
with myxml as
(
select /*+ materialize */ 1 xml_id,
'<xml> <entry timestamp="20170330100429" effective="20170329"> <field name="Name"> <ov><![CDATA[Fran]]></ov> <nv><![CDATA[Frank]]></nv> </field> <field name="Zip"> <ov><![CDATA[13583]]></ov> <nv><![CDATA[13853]]></nv> </field> </entry> <entry timestamp="20170401094783" effective="20170331"> <field name="MI"> <ov><![CDATA[J]]></ov> <nv><![CDATA[A]]></nv> </field> <field name="Suffix"> <ov><![CDATA[Jr]]></ov> <nv><![CDATA[III]]></nv> </field> </entry> </xml>' x from dual
),
HRH as
(
SELECT au.xml_id,
x.tran_ts as chg_timestr,
to_date(substr(x.tran_ts, 0, 8), 'yyyymmdd') chg_date,
cast(substr(x.tran_ts, 9, 6) as int) chg_time,
x.fieldname,
x.ov old_value,
x.nv new_value,
rank() over (partition by au.xml_id, x.fieldname
order by x.tran_ts desc) rnk
FROM myxml au
CROSS JOIN xmltable('/xml/entry/field'
PASSING XMLTYPE(au.x)
COLUMNS tran_ts VARCHAR2(16) PATH './../@timestamp',
fieldname VARCHAR2(250) PATH '@name',
nv VARCHAR2(250) PATH 'nv',
ov VARCHAR2(250) PATH 'ov'
) x
)
select * from HRH
where rnk = 1;