我想显示与文件夹相关的数据,即使相关表格不包含数据。
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
表中没有数据,我也想获取文件夹数据。
如何创建查询?
修改
问题的屏幕截图:
编辑2 +解决方法:
为防止出现错误消息,我们可以创建UNION
个查询,但在我的情况下,我会为IN()
数组中的每个条件创建2²查询。
为了绕过这个问题,我将JOIN
封装在一个视图中,然后JOIN
查询中的视图。这有效但不好,因为查询的一部分在外面,视图从未在数据库的其他地方使用过。
答案 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'
这是结果
答案 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';