我有一些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一样可读?谢谢!
答案 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;