2017-05-19 9 views
0

고객 테이블이 있다고 가정합니다. enter image description hereoracle에서 extractValue 함수를 두 번 이상 사용하면 모든 행에 대해 첫 번째 또는 마지막 레코드에서 중복 데이터가 제공됩니다.

하고 동일 그의 이름을 포함하여 XML 형식 (ID [유형 번호, 이름 [유형 VARCHAR2, 상세 [형 XMLTYPE]. 세부 항목은 고객의 주소를 포함하는 세 개의 기둥이있다 두번째 컬럼 이름

enter image description here

  1. 첫번째 SQL :. 미세화 [NAME하는 두 열에서 동일하다]

    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 
    ) 
    
    0

    출력 :

    1 Janice Janice 
    2 Rita Rita 
    3 Cory Cory 
    
  2. 번째 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 Dunn 
    2 Rita Janice Hale 
    3 Cory Janice Jones 
    

문제점 : 두 번째 SQL에서 나는 단지 O를 변경하는 세부 열에서 추가 데이터 name2를 요청했습니다. ut 두 번째 SQL의 출력에서 ​​name1에 대한 중복 데이터를 볼 수 있기 때문에 완전히 넣습니다. 이 동작이 가능한 방법과 가능한 해결책은 무엇입니까?

xpath의 xpath에 특성을 사용하지 않으면 문제가 존재하지 않습니다. SQL은 여전히 ​​작동하고 올바른 데이터를 제공합니다. 64 비트 생산

  • Customer.sql

    TABLE "고객"을 CREATE

    ( "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>[email protected]</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>[email protected]</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>[email protected]</email> 
         <dob>9/7/1984</dob> 
         <city>Arther St</city> 
        </address> 
    </customer>'); 
    
  • -

    extractValue(detail, '/customer/address/name1') name1, 
    

    세부

    1. 오라클 데이터베이스 11g 릴리스 11.2.0.3.0 같은
    +0

    데이터를 서식있는 텍스트로 게시하십시오. [스크린 샷 없음] (http : //meta.stackoverflow.com/questions/285551/if-may-i-not-upload-code-on-so-ask-a-question/285557 # 285557) – Aleksej

    답변

    0

    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>[email protected]</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>[email protected]</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>[email protected]</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에 있습니다. 오답을 얻는다면, 오라클의 특정 버전의 버그 일 것입니다.

    왜 당신이 세부 열을 검색하기 위해 스칼라 하위 쿼리를 수행하는지에 대해 혼란 스럽습니다. 귀하의 실제 데이터베이스에있는 나머지 세부 정보와 동일한 테이블에없는 xml 열이 있습니까?