1

OracleFULL OUTER JOINで動作していないことに気付きました。

他のクエリは正常に機能しますが、完全外部結合でクエリを起動すると、時間がかかり、切断されてエラーが発生します。

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.
*/

FTD_ACC_IDの条件でサブクエリを削除すると、クエリが完全に実行されることに気付きました。なんで ?

4

6 に答える 6

4

FULL OUTER JOINOracleで問題なくサポートされています。

発生しているエラーは、Oracle のバグのように聞こえますが、何らかの形で破損している可能性があります。alert.logORA-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 の場合、別々の合計が異なるだけのようです。1 つの方法は、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 に答える