고객 테이블이 있다고 가정합니다. oracle에서 extractValue 함수를 두 번 이상 사용하면 모든 행에 대해 첫 번째 또는 마지막 레코드에서 중복 데이터가 제공됩니다.
하고 동일 그의 이름을 포함하여 XML 형식 (ID [유형 번호, 이름 [유형 VARCHAR2, 상세 [형 XMLTYPE]. 세부 항목은 고객의 주소를 포함하는 세 개의 기둥이있다 두번째 컬럼 이름
첫번째 SQL :. 미세화 [NAME하는 두 열에서 동일하다]
0SELECT 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
번째 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,
세부
- 오라클 데이터베이스 11g 릴리스 11.2.0.3.0 같은
데이터를 서식있는 텍스트로 게시하십시오. [스크린 샷 없음] (http : //meta.stackoverflow.com/questions/285551/if-may-i-not-upload-code-on-so-ask-a-question/285557 # 285557) – Aleksej