在oracle中多次使用extractValue函数为所有行提供来自第一条或最后一条记录的重复数据
假设我有一张顾客桌。 有三列id[类型编号]、名称[类型-Varchar2]、详细信息[类型XMLTYPE]。 “详细信息”列包含xml格式的客户地址,包括与第二列名称相同的姓名 第一个sql:Working fine[两列名称相同]在oracle中多次使用extractValue函数为所有行提供来自第一条或最后一条记录的重复数据,oracle,duplicates,xmltype,extract-value,Oracle,Duplicates,Xmltype,Extract Value,假设我有一张顾客桌。 有三列id[类型编号]、名称[类型-Varchar2]、详细信息[类型XMLTYPE]。 “详细信息”列包含xml格式的客户地址,包括与第二列名称相同的姓名 第一个sql:Working fine[两列名称相同] SELECT id, name, extractValue(detail, '/customer/address[@type=''HOME'']/name1') name1 FROM ( SELECT inner1.*, (SELECT deta
SELECT id,
name,
extractValue(detail, '/customer/address[@type=''HOME'']/name1') name1
FROM
(
SELECT inner1.*,
(SELECT detail FROM customer c1 WHERE c1.id = inner1.id) detail
FROM
(SELECT c.id, c.name FROM customer c ) inner1
)
输出:
1 Janice Janice
2 Rita Rita
3 Cory Cory
1 Janice Janice Dunn
2 Rita Janice Hale
3 Cory Janice Jones
第二个sql[工作不正常:第一行的所有行的name1都是重复的]
SELECT id,
name,
extractValue(detail, '/customer/address[@type=''HOME'']/name1') name1,
extractValue(detail, '/customer/address[@type=''HOME'']/name2') name2
FROM
(
SELECT inner1.*,
(SELECT detail FROM customer c1 WHERE c1.id = inner1.id) detail
FROM
(SELECT c.id, c.name FROM customer c) inner1
)
输出:
1 Janice Janice
2 Rita Rita
3 Cory Cory
1 Janice Janice Dunn
2 Rita Janice Hale
3 Cory Janice Jones
问题:在第二个sql中,我只从detail列请求了额外的数据name2,这完全改变了输出,因为您可以在第二个sql的输出中看到name1的重复数据。
这种行为如何可能?可能的解决方案是什么
如果在sql中不使用xpath中的属性,则不存在此问题。sql仍然有效并提供正确的数据。
像
细节
Oracle Database 11g 11.2.0.3.0版-64位生产
Customer.sql
创建表客户
( "ID" NUMBER,
"NAME" VARCHAR2(20 BYTE),
"DETAIL" "SYS"."XMLTYPE"
)
XMLTYPE COLUMN "DETAIL" STORE AS SECUREFILE BINARY XML (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
CACHE NOCOMPRESS KEEP_DUPLICATES
STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ALLOW NONSCHEMA DISALLOW ANYSCHEMA ;
Insert into CUSTOMER (ID,NAME,DETAIL) values (1,'Janice','<?xml version = ''1.0''?><customer>
<customerno>1</customerno>
<address type="HOME">
<name1>Janice</name1>
<name2>Dunn</name2>
<email>janice.dunn98@example.com</email>
<dob>5/2/1980</dob>
<city>Barn St</city>
</address>
</customer>');
Insert into CUSTOMER (ID,NAME,DETAIL) values (2,'Rita','<?xml version = ''1.0''?><customer>
<customerno>2</customerno>
<address type="HOME">
<name1>Rita</name1>
<name2>Hale</name2>
<email>rita.hale40@example.com</email>
<dob>2/2/1981</dob>
<city>Seventh St</city>
</address>
</customer>');
Insert into CUSTOMER (ID,NAME,DETAIL) values (3,'Cory','<?xml version = ''1.0''?><customer>
<customerno>3</customerno>
<address type="HOME">
<name1>Cory</name1>
<name2>Jones</name2>
<email>cory.jones89@example.com</email>
<dob>9/7/1984</dob>
<city>Arther St</city>
</address>
</customer>');
EXTRACTVALUE和EXTRACT在11g中不推荐使用。相反,您应该使用10g中引入的XMLTABLE函数,如下所示:
WITH customer AS (SELECT 1 ID, 'Janice' NAME, XMLTYPE('<?xml version="1.0"?>
<customer><customerno>1</customerno>
<address type="HOME">
<name1>Janice</name1>
<name2>Dunn</name2>
<email>janice.dunn98@example.com</email>
<dob>5/2/1980</dob>
<city>Barn St</city>
</address>
</customer>') detail FROM dual UNION ALL
SELECT 2 ID, 'Rita' NAME , XMLTYPE('<?xml version="1.0"?><customer>
<customerno>2</customerno>
<address type="HOME">
<name1>Rita</name1>
<name2>Hale</name2>
<email>rita.hale40@example.com</email>
<dob>2/2/1981</dob>
<city>Seventh St</city>
</address>
</customer>') detail FROM dual UNION ALL
SELECT 3 ID, 'Cory' NAME , XMLTYPE('<?xml version="1.0"?><customer>
<customerno>3</customerno>
<address type="HOME">
<name1>Cory</name1>
<name2>Jones</name2>
<email>cory.jones89@example.com</email>
<dob>9/7/1984</dob>
<city>Arther St</city>
</address>
</customer>') detail FROM dual)
-- end of mimicking your customer table - you would not need the above, as you already have the table.
-- see the SQL below:
SELECT c.id,
c.name,
x.name1,
x.name2
FROM customer c
CROSS JOIN XMLTABLE('/customer' PASSING c.detail
COLUMNS name1 VARCHAR2(20) PATH 'address[@type="HOME"]/name1',
name2 VARCHAR2(20) PATH 'address[@type="HOME"]/name2') x;
ID NAME NAME1 NAME2
---------- ------ -------------------- --------------------
1 Janice Janice Dunn
2 Rita Rita Hale
3 Cory Cory Jones
至于你的问题,请回答。为什么EXTRACTVALUE没有给出正确的结果-当我使用与我的答案中相同的数据运行您的确切sql语句时,我得到了完全相同的结果。我使用的是11.2.0.4,我只能得出结论,如果您得到了错误的答案,那一定是您特定版本的Oracle中的一个bug
我不明白为什么要执行标量子查询来检索详细信息列,但是-您的xml列是否与实际数据库中的其他详细信息不在同一个表中?请将数据作为格式化文本发布,