2

我有一些 SQL Server 代码要迁移到 Oracle 11g。有很多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 block bb 依赖于a 的结果,OUTER APPLYblock cc 依赖于OUTER APPLYblock bb 的结果,以此类推。如何在 Oracle 数据库中重写这些结构并使它们像在 SQL Server 中一样可读?谢谢!

4

2 回答 2

2

虽然答案在技术上是正确的,但在以下基础上是不准确的。外连接将尝试获取完全请求的数据集,然后根据连接进行过滤,而外应用将过滤器应用于正在获取的记录集,从而导致更快的查询。这对于简单的查询可能并不明显,但对于非常复杂的联接,外部应用比外部联接更有效。

于 2015-05-18T18:27:20.917 回答
-2

您可以使用 LEFT OUTER JOIN 而不是 OUTER APPLY,这两个功能是相同的。

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 回答