2013-02-13 23 views
2

我有一些SQL Server代碼要遷移到Oracle 11g。有很多遞歸OUTER APPLY語句像這樣的:Oracle等價遞歸在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依賴的結果,並OUTER APPLY塊CC依賴對OUTER APPLY塊bb的結果,依此類推。我如何在Oracle數據庫中重寫這些結構並使它們像SQL Server一樣可讀?謝謝!

+1

這不是遞歸的;我想你可以稱它爲迭代式的... – Ben 2013-09-15 19:18:36

回答

-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; 
2

儘管答案在技術上是正確的,但在以下基礎上是不準確的。外連接將嘗試獲取完全請求的數據集,然後根據連接進行過濾,而外應用將過濾器應用於正在提取的記錄集,從而實現更快的查詢。這對於簡單查詢可能不明顯,但對於非常複雜的聯接,外部應用比外部聯接更有效。