1

我刚刚注意到FULL OUTER JOIN不在Oracle中工作。

其他查询工作正常,但是当我使用完全外连接触发查询时,它需要时间并且断开连接并抛出错误。

ORA-03113: 通信通道上的文件结尾

RIGHT OUTER JOINLEFT 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.
*/

刚刚注意到,如果我删除条件 for 中的子查询FTD_ACC_ID,查询运行完美。为什么 ?

4

6 回答 6

4

FULL OUTER JOIN在 Oracle 中得到很好的支持。

您遇到的错误听起来像是 Oracle 错误,或者可能是某种形式的损坏。alert.log每当发生 ORA-03113 时,您应该会发现记录在其中的错误。

通常,如果您收到此错误,是因为该会话的后台 oracle 系统进程已死亡(这几乎总是由于 Oracle 内部错误)。

这对您友好的本地 DBA 来说是个问题。

于 2013-02-25T09:21:40.720 回答
4

基于您的查询+后续评论的解决方法是:

alter session set "_optimizer_cost_based_transformation"=off; 

例如:

SQL> alter session set "_optimizer_cost_based_transformation"=off;

Session altered.

或在 sql 中作为提示

/*+ opt_param('_optimizer_cost_based_transformation', 'off')

例如

select /*+ opt_param('_optimizer_cost_based_transformation', 'off') */ * from 
(
    select FTM_OFFICE_ID,

你可能会遇到错误:

BUG 4204383: ORA-7445[KKQTNLOCBK] USING QUERY WITH SUBQUERY AND FULL OUTER JOIN

仅在 10.2.0.2 及更高版本上可用的补丁(在 10.2.0.4 中完全修复)。

于 2013-02-25T14:45:45.997 回答
2

如果确实(无论出于何种原因)完全外部连接对您不起作用,请使用

-- all rows present in both t1 and t2
select * from t1 inner join t2
union all
-- all rows present in t1 but not in t2
select * from t1 left outer join t2 where t2.pk is null
union all
-- all rows present in t2 but not in t1
select * from t1 right outer join t2 where t1.pk is null

代替

select * from t1 full outer join t2 

这将返回相同的结果。

于 2013-02-25T07:13:35.747 回答
1

你可以试试这个查询:

 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'
            UNION
            SELECT DISTINCT FDP_DHARAUTI_L_ACC_ID FROM FMS_DHARAUTI_PARAMETER WHERE FDP_FISCAL_YEAR='2066/67'   
            )
    GROUP BY FTM_OFFICE_ID 
于 2013-02-25T06:56:39.090 回答
1

看起来唯一不同的是 FTD_ACC_ID 值 105 和 110 的单独总计。一种方法是使用 CASE 语句分别总计。

select 
FTM_OFFICE_ID,
NVL(SUM(CASE FTD_ACC_ID WHEN 105 THEN FTD_NRS_AMOUNT ELSE 0 END),0) as TOTAL_105,
NVL(SUM(CASE FTD_ACC_ID WHEN 110 THEN FTD_NRS_AMOUNT ELSE 0 END),0) as TOTAL_110,
 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 (105,110)
group by FTM_OFFICE_ID 
于 2013-02-25T07:51:43.870 回答
0

像这样在查询中使用UNION而不是FULL 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 = 105
group by FTM_OFFICE_ID ) T1 union (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 = 110
group by FTM_OFFICE_ID )T2
于 2013-02-25T07:02:33.373 回答