Oracle XMLtable 提供交叉连接数据
Oracle XMLtable giving cross joined data
我写了一个 Oracle XML sql 并且它给出如下输出。为了您的快速帮助,我在下面给出了从创建 table 到 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
;
您可以直接提取第一个 XMLTABLE
中的 id
和 name
并且如果您通过层次结构下降以便路径为 '/driXML/sDet/cols/col'
那么每一行来自 XMLTYPE
的将是一个 col
元素,而 id
和 name
将与之相关。
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'
);
输出:
ID | NAME
-: | :----
1 | name1
2 | name2
db<>fiddle here
我写了一个 Oracle XML sql 并且它给出如下输出。为了您的快速帮助,我在下面给出了从创建 table 到 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
;
您可以直接提取第一个 XMLTABLE
中的 id
和 name
并且如果您通过层次结构下降以便路径为 '/driXML/sDet/cols/col'
那么每一行来自 XMLTYPE
的将是一个 col
元素,而 id
和 name
将与之相关。
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'
);
输出:
ID | NAME -: | :---- 1 | name1 2 | name2
db<>fiddle here