SQL等效的Oracle等效递归OUTER APPLY

时间:2013-02-13 01:38:48

标签: sql sql-server oracle

我有一些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块bb取决于a的结果,而OUTER APPLY块cc取决于OUTER APPLY块bb的结果,依此类推。如何在Oracle数据库中重写这些结构并使其像SQL Server一样可读?谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

您可以使用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;