FROM 子句中的子查询是对表 A 中的每条记录(检查)执行一次还是重复执行?
select tA.*
from tableA tA,
(select myGetSingleIdFunction('asdfaf') id from dual) tB
where tA.id = tB.id;
阅读这篇文章: 关于缓存和传播 SQL,作者:Tom Kyte
这是答案:
select tA.*
from tableA tA
where tA.id = (select myGetSingleIdFunction('asdfaf') from dual);
一次。如果您有兴趣,可以查找database cursors,它以您担心的方式更多地遍历集合。
如果查询计划器足够好,也不是。它会识别出您在子查询中使用了一个常量值,并且只使用该表来确定结果应该重复dual
多少次。tableA
基本上把查询变成:
select tA.*
from tableA tA
cross join dual
where tA.id = myGetSingleIdFunction('asdfaf')