Oracle XMLtable 提供交叉连接的数据

Posted

技术标签:

【中文标题】Oracle XMLtable 提供交叉连接的数据【英文标题】:Oracle XMLtable giving cross joined data 【发布时间】:2020-03-23 19:57:56 【问题描述】:

我编写了一个 Oracle XML sql,它给出的输出如下所示。为了您的快速帮助,我已经给出了下面从创建表到下面的 sql 的整个代码。 输出:(错误)

ID, NAME 
1   name1
1   name2
2   name1
2   name2 

想要进行如下输出(必需输出):

ID, NAME
1   name1
2   name2

代码:

CREATE TABLE XML_TBL
   (    "INSTANCE_DETAIL_XML" "SYS"."XMLTYPE" 
   );

SET DEFINE OFF;
Insert into XML_TBL (INSTANCE_DETAIL_XML) values ('<?xml version="1.0" encoding="UTF-8" standalone=''yes''?>
<driXML>
  <sDet>
    <cols>
      <col>
        <id>1</id>
        <name>name1</name>
      </col>
      <col>
        <id>2</id>
        <name>name2</name>
      </col>
    </cols>
  </sDet>
</driXML>
');

我尝试了下面的sql,你可以修改它或使用它创建一个新的:

Select XT_ID.id
     , XT_NAME.name
  FROM xml_tbl XT
       join XMLTABLE
               ('/driXML' PASSING XT.INSTANCE_DETAIL_XML COLUMNS
                    id_XML XMLType    PATH 'sDet/cols/col/id'
                  , name_XML XMLType  PATH 'sDet/cols/col/name'
               ) RI_XML on 1=1
       join XMLTABLE('/id'   PASSING RI_XML.id_XML   COLUMNS ID   number        PATH '.') XT_ID on 1=1
       join XMLTABLE('/name' PASSING RI_XML.name_XML COLUMNS NAME varchar2(50)  PATH '.') XT_NAME on 1=1
;             

【问题讨论】:

【参考方案1】:

您可以直接在第一个XMLTABLE 中提取idname,如果您通过层次结构下降以使路径为'/driXML/sDet/cols/col',则XMLTYPE 中的每一行将是一个@987654327 @ 元素和 idname 将与此相关。

Oracle 设置

CREATE TABLE XML_TBL( INSTANCE_DETAIL_XML ) AS
SELECT XMLTYPE( '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<driXML>
  <sDet>
    <cols>
      <col>
        <id>1</id>
        <name>name1</name>
      </col>
      <col>
        <id>2</id>
        <name>name2</name>
      </col>
    </cols>
  </sDet>
</driXML>' ) FROM DUAL;

查询

SELECT id,
       name
FROM   xml_tbl XT
       CROSS JOIN XMLTABLE(
         '/driXML/sDet/cols/col'
         PASSING XT.INSTANCE_DETAIL_XML
         COLUMNS
           id   NUMBER       PATH 'id',
           name VARCHAR2(50) PATH 'name'
       );

输出

身份证 |姓名 -: | :---- 1 |名称1 2 |名称2

db小提琴here

【讨论】:

以上是关于Oracle XMLtable 提供交叉连接的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle 11g 的 XMLtable

Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象

如何在 oracle XMLTYPE XMLTABLE 中支持 1 级路径目录

Oracle XMLTABLE - 如何从 XMLType 中删除节点?

oracle连接总结(内连接外连接自然连接,交叉连接,自连接)

Oracle查询多表连接