在oracle中多次使用extractValue函数为所有行提供来自第一条或最后一条记录的重复数据

在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

假设我有一张顾客桌。

有三列id[类型编号]、名称[类型-Varchar2]、详细信息[类型XMLTYPE]。 “详细信息”列包含xml格式的客户地址,包括与第二列名称相同的姓名

第一个sql:Working fine[两列名称相同]

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列是否与实际数据库中的其他详细信息不在同一个表中?

请将数据作为格式化文本发布,