2012-06-09 141 views
-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 
         ) 

QUERY2:

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的每一行的主要查询与城市;如果任何行满足条件,那么行的名字被添加到列表中。
  4. 所形成的列表返回到主查询。
  5. 如果返回的列表不为空,然后exists计算为真。然后emp1表的ename,city添加输出。
  6. ename,cityemp1选自第二行emp1表。

能否请你解释QUERY2的执行为我解释QUERY1?

+0

正如你解释query1?哪里?我看不到任何解释!在你解释事情时,请解释你为什么不使用连接。 –

+1

我已经完全重新编写了您的问题,使其可读性和希望有意义。如果您不同意任何事情,请随时重新编辑。 – Ben

+0

不要以有序的步骤思考。只要最终结果与您的六步法产生的结果相符,DBMS就可以自由制定任何计划。这甚至可能是笛卡儿的产品+修剪任何不满足存在和存在条款的东西。 – wildplasser

回答

0

你的第二个查询说的是:给我的员工如果离开他们(第一子查询)合作的公司,如果这样的公司(从第一个子查询取)孟买(第二子查询)存在。你会得到具有以下,可能更effecient,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 先生如何获取的行,你可以看看查询说明计划