この単純なクエリがOracleでは正常に機能するのに、DB2では機能しない理由:
select *
from
sysibm.dual d1
left join sysibm.dual d2 on 1=1 and exists (select 1 from sysibm.dual)
サブクエリを含む条件をwhere句に移動すると役立つ場合がありますが、これにより、外部結合が内部に制限されます。
あなたが持っているクエリを実行しようとすると、-338
エラーが発生します。Information Center (リンクを参照) によると、ON
句には次の制限があります。
JOIN 演算子または MERGE ステートメントに関連付けられた ON 句は、次のいずれかの理由で無効です。
* The ON clause cannot include any subqueries. * Column references in an ON clause must only reference columns of tables that are in the scope of the ON clause. * Scalar fullselects are not allowed in the expressions of an ON clause. * A function referenced in an ON clause of a full outer join must be deterministic and have no external action. * A dereference operation (->) cannot be used. * A SQL function or SQL method cannot be used. * The ON clause cannot include an XMLQUERY or XMLEXISTS expression.
あなたのクエリでそれが可能かどうかはわかりませんが、おそらく次のように書き直すことができると思いますか:
select *
from
sysibm.dual d1
left join (
SELECT dl.*,
CASE WHEN EXISTS (SELECT 1 FROM sysibm.dual)
THEN 1
ELSE 0
END AS jn
FROM sysibm.dual dl
) D2
on 1=1 and 1=d2.jn
これは DB2 V10.1 で機能します。フィックスパックがインストールされていません。