2013-05-02 54 views
0

我正在使用Oracle 11G。 我有一个PL/SQL过程,它使用表中XMLTYPE列的xquery读取XML。该XML包含DEPARTMENT及其SECTIONS的数据。 DEPARTMENT与SECTIONS有一对多的关系,即一个DEPARTMENT可以有一个或多个SECTIONS,并且可能有DEPARTMENT没有任何SECTION的情况。来自两个表的PL/SQL唯一列标识

XML的结构是这样的:<DATA>标签标识一个DEPARTMENT和一组相应的SECTION。

XML里面我是用

<ROWSET> 
<DATA> 
<DEPARTMENT> 
    <DEPARTMENT_ID>DEP1</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>myDEPARTMENT1</DEPARTMENT_NAME> 
</DEPARTMENT> 
<SECTIONS> 
    <SECTIONS_ID>6390135666643567</SECTIONS_ID> 
    <SECTIONS_NAME>mySection1</SECTIONS_NAME> 
    </SECTIONS> 
    <SECTIONS> 
    <SECTIONS_ID>6390135666643567</SECTIONS_ID> 
    <SECTIONS_NAME>mySection2</SECTIONS_NAME> 
    </SECTIONS> 
</DATA> 
<DATA> 
<DEPARTMENT> 
    <DEPARTMENT_ID>DEP2</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>myDEPARTMENT2</DEPARTMENT_NAME> 
</DEPARTMENT> 
<SECTIONS> 
    <SECTIONS_ID>63902</SECTIONS_ID> 
    <SECTIONS_NAME>mySection1</SECTIONS_NAME> 
    </SECTIONS> 
</DATA> 
<DATA> 
<DEPARTMENT> 
    <DEPARTMENT_ID>DEP3</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>myDEPARTMENT3</DEPARTMENT_NAME> 
</DEPARTMENT> 
</DATA> 
</ROWSET> 

查询是: -

select d.department_id 
     , d.department_name 
     , s.sections_id 
     , s.sections_name 
    from xml_unit_download t 
    , xmltable(
     '/ROWSET/DATA' 
     passing t.xml_file 
     columns 
      DEPARTMENT_ID varchar2(20) path 'DEPARTMENT/DEPARTMENT_ID' 
     , DEPARTMENT_NAME varchar2(30) path 'DEPARTMENT/DEPARTMENT_NAME' 
     , SECTIONS  xmltype  path 'SECTIONS' 
     ) d 
    , xmltable(
     '/SECTIONS' 
     passing d.sections 
     columns 
      SECTIONS_ID  varchar2(20) path 'SECTIONS_ID' 
     , SECTIONS_NAME varchar2(30) path 'SECTIONS_NAME' 
    ) s 
where 
    t.Status = 7 

现在这个XQuery不取DEP3的结果,我将如何应付呢?

------------- 修订 -------------
期望输出

DEPARTMENT_ID  DEPARTMENT_NAME    SECTIONS_ID   SECTIONS_NAME 
-------------------- ------------------------------ -------------------- 
DEP1     myDEPARTMENT1     6390135666643567  mySection1 
DEP1     myDEPARTMENT1     6390135666643567  mySection2 
DEP2     myDEPARTMENT2     63902    mySection1 
DEP3     myDEPARTMENT3 
+0

您能否请您说明您的预期输出应该是什么? – OldProgrammer 2013-05-02 11:46:50

+0

@OldProgrammer请参阅更新的预期输出,谢谢 – 2013-05-02 12:15:30

回答

2

你可以让他们外连接:

... 
    from xml_unit_download t 
    , xmltable(
... 
     ) (+) d 
    , xmltable(
... 
    ) (+) s 
... 

这给:

DEPARTMENT_ID  DEPARTMENT_NAME    SECTIONS_ID   SECTIONS_NAME 
-------------------- ------------------------------ -------------------- ------------------------------ 
DEP1     myDEPARTMENT1     6390135666643567  mySection1 
DEP1     myDEPARTMENT1     6390135666643567  mySection2 
DEP2     myDEPARTMENT2     63902    mySection1 
DEP3     myDEPARTMENT3