Conceptually, nested loops are equivalent to two nested for loops.For example, if a query joins
employees and departments, then a nested loop in pseudocode might be:
FOR erow IN (select * from employees where X=Y) LOOP
FOR drow IN (select * from departments where erow is matched) LOOP
output values from erow and drow
END LOOP
END LOOP
The inner loop is executed for every row of the outer loop. The employees table is the
"outer" data set because it is in the exterior for loop. The outer table is sometimes
called a driving table. The departments table is the "inner" data set because it is in the
interior for loop.
从概念上讲,嵌套循环相当于两个嵌套for循环。 例如,如果一个查询连接
员工和部门,那么伪代码中的嵌套循环可能是:
FOR erow IN (select * from employees where X=Y) FOR erow IN (select * from employees where X=Y
FOR drow IN (select * from where errow is matched)LOOP
output values from erow and drow
END LOOP
END LOOP
外部循环的每一行都执行内部循环。 employees表是
“外部”数据集,因为它在外部for循环。 外层的表有时是
叫做驱动表。 部门表是“内部”数据集,因为它位于
内部循环。
这玩意直接翻译出来你也不一定能懂,我换种方式说明一下吧
select e.*,
d.department_name
from hr.employees e,hr.departments d
where e.department_id = d.department_id
and e.job_id='101'
上面这个sql里,执行计划就有nested loop,它就相当于套了两个循环,下面是伪代码
for erow in (select * from employees where job_id='101') loop
for drow in (select * from departments where department_id =erow.department_id ) loop
select erow.*,drow.department_name from dual;
end loop;
end loop;
最外层循环的employees 叫驱动表,因为它先定义了数据范围job_id='101',然后把这个数据中的每一行丢到内部再循环获取departments 的数据