2

Oracle 11g に移行する SQL Server コードがいくつかあります。OUTER APPLY次のような再帰ステートメントがたくさんあります。

select  a.colA
       ,bb.retB
       ,cc.retC
from tableA a

outer apply
(
select funcB(b.colB) as retB
from tableB b
where b.colA = a.colA
) bb

outer apply
(
select funcC(bb.retB, c.colC) as retC
from tableC c
where c.colB = bb.retB
) cc

……

重要な点は、OUTER APPLY ブロック bb は a の結果にOUTER APPLY依存し、ブロック cc はOUTER APPLYブロック bb の結果に依存するということです。これらの構造を Oracle データベースで書き換えて、SQL Server と同じように読みやすくするにはどうすればよいですか? ありがとう!

4

2 に答える 2

2

答えは技術的には正しいですが、次の根拠に基づいて不正確です。外部結合は、要求されたデータ セットを完全にフェッチしてから、結合に従ってフィルタリングしようとしますが、外部適用はフェッチされるレコード セットにフィルターを適用するため、クエリが高速になります。これは単純なクエリでは目立たないかもしれませんが、非常に複雑な結合の場合、外部適用は外部結合よりもはるかに効率的です。

于 2015-05-18T18:27:20.917 に答える
-2

OUTER APPLY の代わりに LEFT OUTER JOIN を使用できます。両方の機能は同じです。

select  a.colA
       ,bb.retB
       ,cc.retC
from tableA a

LEFT OUTER JOIN 
(
select funcB(b.colB) as retB
from tableB
) b on b.colA = a.colA
LEFT OUTER JOIN 
(
select funcC(bb.retB, c.colC) as retC
from tableC 
where 
) c on c.colB = bb.retB;
于 2013-09-15T19:11:26.467 に答える