【问题标题】:Solutions for outer join operator (+) not allowed in operand like OR or INOR 或 IN 等操作数中不允许外连接运算符 (+) 的解决方案
【发布时间】:2021-04-11 08:51:28
【问题描述】:

我已经尝试了以下查询,但我仍然收到此错误并且我无法找到解决它的解决方案。我希望能够根据情况获得三个日期之一(L​​OAD,LAST_MODIFIED,ORDER_ITEM_LAST_UPDATE)。但是,我还需要使用实际的日历日期来使用里面的特定列。这就是为什么我使用 LOAD_DATE 进行连接 (+)。现在,我试图找到一种方法来避免出现错误 ORA-01719,有人可以帮助我吗?

ORA-01719: OR 或 IN 的操作数中不允许外连接运算符 (+) 01719. 00000 - “OR 或 IN 的操作数中不允许外连接运算符 (+)” *原因:外连接出现在 or 子句中。 *Action:如果 A 和 B 是谓词,得到 (A(+) 或 B) 的效果, 尝试(选择哪里(A(+)而不是B))联合所有(选择哪里(B))。 行错误:17 列:35

代码:

SELECT A.PRODUCT_ID AS KEY,
       TO_CHAR(A.ORDER_DATE, 'MM/DD/YYYY') AS ORDER_CREATION_DATE,
       TO_CHAR(B.LOAD_DATE, 'MM/DD/YYYY') AS LOAD_DATE,
       TO_CHAR(B.LAST_MODIFIED_DATE, 'MM/DD/YYYY') AS LAST_MODIFIED_DATE,
       TO_CHAR(B.ORDER_ITEM_LAST_UPDATED, 'MM/DD/YYYY') AS ORDER_ITEM_LAST_UPDATED, 
       A.ORDER_STATUS AS ORDER_STATUS, 
       A.ORDER_ITEM_STATUS AS ORDER_ITEM_STATUS, 
       A.ORDER_ACTION AS ORDER_ACTION,
       NVL(B.ORDER_ITEM_ACTION, 'NOT APPLICABLE') AS ORDER_ITEM_ACTION,
       NVL(B.CEASE_REASON, 'NOT APPLICABLE') AS ORDER_CEASE_REASON,
       A.PRO_SYSTEM AS PRO_SYSTEM, 
       CASE WHEN (A.PRO_SYSTEM = 'X') THEN 'Y' ELSE 'Z' END AS FLOW 

         FROM PART1 A, PART2 B,DATA_REP_CALENDAR CAL 

       WHERE A.ORDER_SEQ = B.ORDER_SEQ
       AND TRUNC(B.LOAD_DATE) = CAL.ACTUAL_CALENDAR_DATE (+)
         
        AND TRUNC(B.LOAD_DATE) BETWEEN ADD_MONTHS( TO_DATE('07/01/2019', 'MM/DD/YYYY'),- 6) and LAST_DAY( TO_DATE('07/01/2019', 'MM/DD/YYYY'))        
        OR TRUNC(B.LAST_MODIFIED_DATE) BETWEEN ADD_MONTHS( TO_DATE('07/01/2019', 'MM/DD/YYYY'),- 6) and LAST_DAY( TO_DATE('07/01/2019', 'MM/DD/YYYY'))
        OR TRUNC(B.ORDER_ITEM_LAST_UPDATED) BETWEEN ADD_MONTHS( TO_DATE('07/01/2019', 'MM/DD/YYYY'),- 6) and LAST_DAY( TO_DATE('07/01/2019', 'MM/DD/YYYY'));

【问题讨论】:

  • 只需使用标准LEFT JOIN重写它
  • @a_horse_with_no_name 你能告诉我如何在我的代码中使用它吗?我对 SQL 很陌生,所以在这里我有点困惑

标签: oracle oracle11g oracle-apex outer-join


【解决方案1】:

基于 Scott 的 EMPDEPT 表的简单示例;有40个部门,没有人在里面工作。如果要显示它(在加入这些表时),请使用外连接。 “旧的”Oracle 外连接运算符是(+),它有它的...缺点。如果您使用outer join,很多东西(不适用于(+))现在都可以使用了。

这就是你现在拥有的:

SQL> select d.deptno, d.dname, e.ename
  2  from dept d,
  3       emp e
  4  where d.deptno = e.deptno (+)
  5  order by d.deptno, e.ename;

    DEPTNO DNAME          ENAME
---------- -------------- ----------
        10 ACCOUNTING     CLARK
        10 ACCOUNTING     KING
        10 ACCOUNTING     MILLER
        20 RESEARCH       ADAMS
        20 RESEARCH       FORD
        20 RESEARCH       JONES
        20 RESEARCH       SCOTT
        20 RESEARCH       SMITH
        30 SALES          ALLEN
        30 SALES          BLAKE
        30 SALES          JAMES
        30 SALES          MARTIN
        30 SALES          TURNER
        30 SALES          WARD
        40 OPERATIONS

15 rows selected.

SQL>

你应该这样重写它:

SQL> select d.deptno, d.dname, e.ename
  2  from dept d left join emp e on e.deptno = d.deptno
  3  order by d.deptno, e.ename;

    DEPTNO DNAME          ENAME
---------- -------------- ----------
        10 ACCOUNTING     CLARK
        10 ACCOUNTING     KING
        10 ACCOUNTING     MILLER
        20 RESEARCH       ADAMS
        20 RESEARCH       FORD
        20 RESEARCH       JONES
        20 RESEARCH       SCOTT
        20 RESEARCH       SMITH
        30 SALES          ALLEN
        30 SALES          BLAKE
        30 SALES          JAMES
        30 SALES          MARTIN
        30 SALES          TURNER
        30 SALES          WARD
        40 OPERATIONS

15 rows selected.

SQL>

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 2018-12-05
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多