【问题标题】:LEFT OUTER JOIN with XMLTABLE doesn't work?使用 XMLTABLE 的 LEFT OUTER JOIN 不起作用?
【发布时间】:2018-11-30 18:41:18
【问题描述】:

这里是示例查询-

WITH empdata AS (SELECT xmltype ('<office>
                            <emp>
                                <empno>1</empno>
                                <ename>Abraham</ename>
                                <deptno>10</deptno>
                            </emp>
                            <emp>
                                <empno>2</empno>
                                <ename>Alexander</ename>
                                <deptno>10</deptno>
                            </emp>
                            <emp>
                                <empno>3</empno>
                                <ename>Benjamin</ename>
                                <deptno>20</deptno>
                            </emp>
                            <emp>
                                <empno>4</empno>
                                <ename>Bradley</ename>
                                <deptno>20</deptno>
                            </emp>
                         </office>') AS xcol FROM dual),
     dept AS
         (SELECT 10 deptno, 'Accounting' dname FROM dual
          UNION ALL
          SELECT 20, 'Broking' FROM dual
          UNION ALL
          SELECT 30, 'HR' FROM dual)
SELECT d.dname, e.ename, e.empno
  FROM dept d
       CROSS JOIN empdata e_data
       LEFT OUTER JOIN
       xmltable (
           'office/emp'
           PASSING e_data.xcol
           COLUMNS deptno NUMBER (28, 0) PATH 'deptno',
                   ename VARCHAR2 (10) PATH 'ename',
                   empno NUMBER (28, 0) PATH 'empno') e
           ON d.deptno = e.deptno;

我得到的结果-

DNAME      ENAME           EMPNO
---------- ---------- ----------
Accounting Abraham             1
Accounting Alexander           2
Broking    Benjamin            3
Broking    Bradley             4

为什么dept 的第三行没有显示,即 HR 没有显示在结果集中?理想情况下,根据 LEFT JOIN 规则,左侧表中的所有记录都应显示。为什么那个被过滤掉了?

【问题讨论】:

    标签: oracle xmltable oracle-xml-db


    【解决方案1】:

    你有外部连接和交叉连接错误的方式。您需要将empdata 交叉连接到xmltable 作为一个子查询,并使用该子查询(内联视图)作为外部连接的目标:

    ...
    SELECT d.dname, e.ename, e.empno
      FROM dept d
           LEFT OUTER JOIN
           (
             SELECT x.*
              FROM empdata e_data
                   CROSS JOIN 
                   xmltable (
                       'office/emp'
                       PASSING e_data.xcol
                       COLUMNS deptno NUMBER (28, 0) PATH 'deptno',
                               ename VARCHAR2 (10) PATH 'ename',
                               empno NUMBER (28, 0) PATH 'empno') x
            ) e
               ON d.deptno = e.deptno;
    
    DNAME      ENAME           EMPNO
    ---------- ---------- ----------
    Accounting Abraham             1
    Accounting Alexander           2
    Broking    Benjamin            3
    Broking    Bradley             4
    HR                              
    

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2010-09-29
      相关资源
      最近更新 更多