OR或IN的操作数中不允许外连接运算符

时间:2014-09-08 15:51:52

标签: sql oracle join plsql oracle10g

我想显示与文件夹相关的数据,即使相关表格不包含数据。

SELECT *
FROM FOLDER fold

-- Other joins skipped for brevity

-- Display null values if no data found in INVOICE items
LEFT OUTER JOIN INVOICE inv                       -- Works if INNER JOIN, but I need OUTER
    ON inv.DOS_CODE_ID = fold.dos_code_id 
    AND inv.ECO_CODE_ID IN ('2', '4')             -- Works if I remove those
    AND inv.SER_CODE_ID IN ('Item 1', 'Item 2')   -- two criterias

-- Display null values if no data found in CMD_LOC items
LEFT OUTER JOIN CMD_LOC loc
    ON inv.dos_code_id = loc.dos_code_id 
    AND inv.cmd_code_id = loc.cmd_code_id
    AND inv.cmd_dt_creat = loc.cmd_dt_creat

WHERE fold.DOS_CODE_ID = 'ABC123';

通过这样做,我收到此错误消息:

  

ORA-01719:OR或IN的操作数中不允许外连接运算符(+)

     

ORA-02063:[我的数据库链接]的前一行

我了解问题是什么,可以通过LEFT OUTER JOIN INVOICE替换INNER JOIN INVOICE来解决问题,但即使INVOICE表中没有数据,我也想获取文件夹数据。

如何创建查询?


修改

问题的屏幕截图: enter image description here


编辑2 +解决方法:

为防止出现错误消息,我们可以创建UNION个查询,但在我的情况下,我会为IN()数组中的每个条件创建2²查询。

为了绕过这个问题,我将JOIN封装在一个视图中,然后JOIN查询中的视图。这有效但不好,因为查询的一部分在外面,视图从未在数据库的其他地方使用过。

2 个答案:

答案 0 :(得分:2)

()放入所有On参数

  SELECT *
    FROM FOLDER fold

    -- Other joins skipped for brevity

    -- Display null values if no data found in INVOICE items
    LEFT OUTER JOIN INVOICE inv
        ON (inv.DOS_CODE_ID = fold.dos_code_id 
        AND inv.ECO_CODE_ID IN ('2', '4') 
        AND inv.SER_CODE_ID IN ('Item 1', 'Item 2') )

    -- Display null values if no data found in CMD_LOC items
    LEFT OUTER JOIN CMD_LOC loc
        ON (inv.dos_code_id = loc.dos_code_id 
        AND inv.cmd_code_id = loc.cmd_code_id
        AND inv.cmd_dt_creat = loc.cmd_dt_creat)

    WHERE dos.DOS_CODE_ID = 'ABC123';

----在我的科西嘉数据库中给我一个结果

[SELECT *
FROM m_product fold
  -- Other joins skipped for brevity
  -- Display null values if no data found in INVOICE items
LEFT OUTER JOIN c_INVOICE inv
ON inv.AD_ORG_ID   = fold.AD_ORG_ID
AND inv.C_ORDER_ID IN ('1000001', '1000002')           -- If I remove those two
AND inv.DOCSTATUS IN ('CO', 'BR') -- criterias that works
  -- Display null values if no data found in CMD_LOC items
LEFT OUTER JOIN c_order loc
ON inv.C_ORDER_ID     = loc.C_ORDER_ID
AND inv.AD_CLIENT_ID   = loc.AD_CLIENT_ID   
AND inv.AD_ORG_ID   = loc.AD_ORG_ID

WHERE fold.M_PRODUCT_ID = '1000000'

这是结果

enter image description here

答案 1 :(得分:0)

解决方法2:

我今天遇到了同样的问题并找到了另一种解决方法...... Instr功能。它仅在您的ECO_CODE_ID为0-9时才有效。 :)

SELECT *
FROM FOLDER fold

-- Other joins skipped for brevity

-- Display null values if no data found in INVOICE items
LEFT OUTER JOIN INVOICE inv                       -- Works if INNER JOIN, but I need OUTER
    ON inv.DOS_CODE_ID = fold.dos_code_id 
    AND ( INSTR(inv.ECO_CODE_ID,'2')+INSTR(inv.ECO_CODE_ID,'4') > 0 )
    AND ( INSTR(inv.SER_CODE_ID,'Item 1')+INSTR(inv.SER_CODE_ID,'Item 2') > 0 )
    --AND inv.ECO_CODE_ID IN ('2', '4')             -- Works if I remove those
    --AND inv.SER_CODE_ID IN ('Item 1', 'Item 2')   -- two criterias

-- Display null values if no data found in CMD_LOC items
LEFT OUTER JOIN CMD_LOC loc
    ON inv.dos_code_id = loc.dos_code_id 
    AND inv.cmd_code_id = loc.cmd_code_id
    AND inv.cmd_dt_creat = loc.cmd_dt_creat

WHERE fold.DOS_CODE_ID = 'ABC123';