-1

当有多个子查询时,我对相关子查询执行有疑问。

当只有一个子查询时,我知道相关子查询的执行。但是,如果有多个我无法理解。

我参考了许多书籍和网站,但找不到合适的答案。

下面是两个查询。我知道 query1 是如何执行的,但 query2 是如何执行的?

查询1:

select e.ename, e.city 
  from emp1 e 
 where exists ( select f.ename 
                  from emp2 f  
                 where f.ename = ’ajay’ 
                   and e.city = f.city
                       )

查询2:

select e.ename 
  from employee e 
 where exists ( select ‘x’ 
                  from emp_company c 
                 where e.ename = c.ename  
                   and exists ( select ‘x’ 
                                  from company m 
                                 where c.cname = m.cname 
                                   and m.city = ’bombay’ 
                                       )
                       )
  1. 在执行 query1 的第一步中enamecity考虑了员工表的第一行。
  2. 在 query1 执行的第二步中,将主查询中考虑的城市与 的每一行进行比较emp2
  3. 将主查询中的城市与 emp2 的每一行进行比较;如果任何行满足将行 ename 添加到列表的条件。
  4. 形成的列表返回到主查询。
  5. 如果返回的列表不为空,则exists计算结果为 true。然后emp1表的enamecity添加输出。
  6. , from是从表的第二行中选择ename的。cityemp1emp1

您能否像我解释 query1 一样解释 query2 的执行?

4

1 回答 1

0

你的第二个查询说的是:如果有他们工作的公司退出(第一个子查询)并且如果孟买存在这样的公司(取自第一个子查询)(第二个子查询),请给我员工。使用以下可能更有效的 select 语句,您将获得相同的结果:

select e.ename 
from employee e,
  emp_company ec,
  company c 
where e.ename = ec.ename
  and ec.cname = c.cname
  and c.name = 'bombay'

这是为了逻辑。如果您对Oracle 先生如何获取行的详细信息感兴趣,您可以查看Query Explain Plan

于 2012-06-10T07:42:53.817 回答