2013-03-05 86 views
0

對於表A中的每個記錄(檢查),FROM子句中的子查詢是否執行ONCE或REPEATEDLY ?在FROM子句中重複執行子查詢

select tA.* 
from tableA tA, 
     (select myGetSingleIdFunction('asdfaf') id from dual) tB 
where tA.id = tB.id; 
+1

哪個DBMS是這個呢? – 2013-03-05 20:01:22

+0

這是針對Oracle數據庫的。 – psabela 2013-03-05 20:33:43

回答

1

閱讀這篇文章:On Caching and Evangelizing SQL By Tom Kyte

這就是答案:

select tA.* 
from tableA tA 
    where tA.id = (select myGetSingleIdFunction('asdfaf') from dual); 
+0

這沒有意義。如果'dual'表包含多個記錄,則會出現子查詢返回多個值的錯誤。 – Guffa 2013-03-07 21:29:33

0

如果查詢規劃器是足夠好的話,它會認識到您在子查詢中使用了一個常量值,並且僅使用表dual來確定應該重複tableA的結果的次數。

基本上轉動查詢分成:

select tA.* 
from tableA tA 
cross join dual 
where tA.id = myGetSingleIdFunction('asdfaf') 
+1

SQL Server只會在必須subquerys上使用'Nested Loops'。這意味着它將爲外部查詢中的每一行執行內部(子查詢)。 – JodyT 2013-03-05 20:11:45

+0

在我的sql中,我把函數的結果放到了對偶中,並使用了對偶的內容來過濾tableA。在這裏列出的sql中,dual的內容是什麼以及它是如何被填充的? – psabela 2013-03-05 20:35:56

+1

'dual'是一個特殊的系統表,它有一行。你不需要也不能填充它。 – 2013-03-05 20:52:44

0

一旦。如果你有興趣,你可以查看database cursors,它以你所擔心的方式遍歷一個集合。

相關問題