全外部結合は、SQE 最適化プログラムによってサポートされています。内部、左外部、または左例外のサポートされた結合タイプに、右外部結合および右例外結合が書き換えられるように、全外部結合も書き換えられます。
A FULL OUTER JOIN B の全外部結合は、(A LEFT OUTER JOIN B) UNION ALL (B LEFT EXCEPTION JOIN A) と等価です。 以下の例は、再書き込みについて説明しています。
SELECT EMPNO, LASTNAME, DEPTNAME FROM CORPDATA.EMPLOYEE XXX FULL OUTER JOIN CORPDATA.DEPARTMENT YYY ON XXX.WORKDEPT = YYY.DEPTNO
この照会は、次のように書き直されます。
SELECT EMPNO, LASTNAME, DEPTNAME FROM CORPDATA.EMPLOYEE XXX LEFT OUTER JOIN CORPDATA.DEPARTMENT YYY ON XXX.WORKDEPT = YYY.DEPTNO UNION ALL SELECT EMPNO, LASTNAME, DEPTNAME FROM CORPDATA.DEPARTMENT YYY LEFT EXCEPTION JOIN CORPDATA.EMPLOYEE XXX ON XXX.WORKDEPT = YYY.DEPTNO
複数の FULL OUTER JOIN 要求による照会 (例えば、A FULL OUTER JOIN B FULL OUTER JOIN C) は、迅速にこの複雑な再書き込み状態になります。この複雑化は、以下の例で示されています。
ライブ・データ・モードで実行されない場合、最適化プログラムは、中間結果を一時データ・オブジェクトにカプセル化することによって、最適化中および実行時の両方でパフォーマンスを促進できます。 このオブジェクトは、いったん最適化すれば、書き換えのスキャンされた側とプローブされた側の両方に差し込むことができます。 これらの共有された一時オブジェクトにより、要求を満たすために特定のテーブルを何度もパススルーする必要がなくなります。
この例では、(A FULL OUTER JOIN B) の結果が、C との FULL OUTER 結合中にカプセル化の候補になります。
A FULL OUTER JOIN B FULL OUTER JOIN C
この照会は、次のように書き直されます。
((A LEFT OUTER JOIN B) UNION ALL (B LEFT EXCEPTION JOIN A)) LEFT OUTER JOIN C ) UNION ALL (C LEFT EXCEPTION JOIN ((A LEFT OUTER JOIN B) UNION ALL (B LEFT EXCEPTION JOIN A))
FULL OUTER は、結合要求の両サイドが、結果の応答セットに NULL 値を生成できることを暗黙に示します。 照会の WHERE 文節内でのローカル選択の結果として、FULL OUTER は LEFT OUTER または INNER JOIN に適切にダウングレードされることになります。
FULL OUTER JOIN 動作を必要としていて、ローカル選択を適用する場合は、FULL OUTER JOIN の ON 文節でローカル選択を指定するか、または共通表式を使用します。 たとえば、次のとおりです。
WITH TEMPEMP AS (SELECT * FROM CORPDATA.EMPLOYEE XXX WHERE SALARY > 10000) SELECT EMPNO, LASTNAME, DEPTNAME FROM TEMPEMP XXX FULL OUTER JOIN CORPDATA.DEPARTMENT YYY ON XXX.WORKDEPT = YYY.DEPTNO