【发布时间】:2013-02-25 06:45:00
【问题描述】:
我刚刚注意到 FULL OUTER JOIN 在 Oracle 中不起作用。
其他查询工作正常,但是当我使用完全外连接触发查询时,它需要时间并且断开连接并抛出错误。
ORA-03113:通信通道上的文件结束
RIGHT OUTER JOIN 和 LEFT OUTER JOIN 工作正常。
对于下面我使用完全外连接获取所有记录的查询,有什么替代方法?
select * from
(
select
FTM_OFFICE_ID,
NVL(SUM(FTD_NRS_AMOUNT),0) as TOTAL
from FMS_TRANS_DTL
inner join FMS_TRANS_MST ON FMS_TRANS_MST.FTM_TRANS_MST_ID = FMS_TRANS_DTL.FTD_TRANS_MST_ID
inner join FMS_FC_VOUCHER_CONFIG ON FMS_FC_VOUCHER_CONFIG.FFVC_VOUCHER_ID = FMS_TRANS_MST.FTM_VOUCHER_ID
where FFVC_ACCOUNT_TYPE = 3 and FTM_FISCAL_YEAR='2066/67'
and FTD_ACC_ID in (select distinct FDP_DHARAUTI_C_ACC_ID from FMS_DHARAUTI_PARAMETER where FDP_FISCAL_YEAR='2066/67' )
/*and FTD_ACC_ID in (591)*/
group by FTM_OFFICE_ID
) T1
full outer join
(
select
FTM_OFFICE_ID,
NVL(SUM(FTD_NRS_AMOUNT),0) as TOTAL
from FMS_TRANS_DTL
inner join FMS_TRANS_MST ON FMS_TRANS_MST.FTM_TRANS_MST_ID = FMS_TRANS_DTL.FTD_TRANS_MST_ID
inner join FMS_FC_VOUCHER_CONFIG ON FMS_FC_VOUCHER_CONFIG.FFVC_VOUCHER_ID = FMS_TRANS_MST.FTM_VOUCHER_ID
where FFVC_ACCOUNT_TYPE = 3 and FTM_FISCAL_YEAR='2066/67'
/*and FTD_ACC_ID in (592)*/
and FTD_ACC_ID in
(select distinct FDP_DHARAUTI_L_ACC_ID from FMS_DHARAUTI_PARAMETER where FDP_FISCAL_YEAR='2066/67' )
group by FTM_OFFICE_ID
) T2
on T1.FTM_OFFICE_ID=T2.FTM_OFFICE_ID
/*
The no. of rows that T1 can have can be different that no. of rows T2 can have.
Its not necessary any OFFICE_ID must have amount under any FTD_ACC_ID.
*/
刚刚注意到,如果我在FTD_ACC_ID 的条件下删除子查询,查询就会完美运行。为什么?
【问题讨论】:
-
“不起作用”到底是什么意思? Oracle 很好地支持全外连接。
-
@FrankSchmitt:上面写着“ORA-03113: end-of-file on communication channel”,我在某处读到了 Oracle 不支持完全外连接。
-
@hsuk 您是否检查了用户转储区域中的任何跟踪文件?很可能有一个用户转储与幕后相关的 ORA-00600/7445。
-
@hsuk 尝试禁用外部连接的优化。
alter session set _optimizer_cost_based_transformation=off;或在 sql 中作为提示/*+ opt_param('_optimizer_cost_based_transformation', 'off')。使用复杂的 SQL 时有几个 ANSI 错误,尤其是在 10g 初始版本中。如果这不能解决问题,那么您应该联系 Oracle 支持,假设您有访问权限,因为列出的几个错误可能与此错误匹配 -
@hsuk 因为它是你击中的错误。并给定转储参数+您的跟进,可能的错误是
BUG 4204383: ORA-7445[KKQTNLOCBK] USING QUERY WITH SUBQUERY AND FULL OUTER JOIN(修复了 10.2.0.4,可向后移植回 10.2.0.2)。如果该错误是正确的,我提供的解决方法也应该有效。