Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:自连接XMLTable输出_Oracle_Common Table Expression_Self Join_Xmltable - Fatal编程技术网

Oracle:自连接XMLTable输出

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解析到WITH子句中的一个表中,然后在主查询中将该表连接到它自己。然而,我没有得到任何记录,即使只有一个最小的测试用例

以下是示例xml:

<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;