来自两个表的 PL/SQL 唯一列标识

Posted

技术标签:

【中文标题】来自两个表的 PL/SQL 唯一列标识【英文标题】:PL/SQL unique column identification from two table 【发布时间】:2013-05-02 11:43:30 【问题描述】:

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

XML 的结构是这样的,<DATA> 标记标识一个 DEPARTMENT 及其相应 SECTIONS 的集合。

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

【问题讨论】:

你能说明你的预期输出应该是什么吗? @OldProgrammer 请查看更新后的预期输出,谢谢 【参考方案1】:

您可以将它们设为外部连接:

...
   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

【讨论】:

以上是关于来自两个表的 PL/SQL 唯一列标识的主要内容,如果未能解决你的问题,请参考以下文章

使用pl / sql或sql在学生表的多个列中拆分数据

ORA-06550:第 1 行,第 7 列:PLS-00201:必须声明标识符“PAYMENT_UPDATE” ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

如何在pl/sql中获取表的三列的组合?

PL/SQL:根据条件更新另一个表时未找到数据

PL/SQL详细介绍,设置oracle相关

在 PL/SQL 中引用动态 SQL 的标识符