EXISTS子句和JOIN

时间:2015-09-27 12:33:06

标签: sql oracle oracle11g sqlplus

查询1

select ename,deptno 
from emp1 
where exists 
(select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);

返回对应于子查询中deptno字段强加的条件的ename

查询2

select ename,deptno 
from emp1 
where exists 
(select deptno from dpt where deptno>20);

但在查询2中,结果包含字段ename和deptno的所有值

哪些更改了两个查询中的结果集?是否因为加入?实际上,联接如何在查询1中引入不同的结果集?为什么在查询1中而不是在查询2中考虑where条件?

 legends:
 empname is employee name in the table emp,
 deptno is department no. which is the common field in emp and dept tables.

1 个答案:

答案 0 :(得分:4)

第一个查询是相关子查询

  

Correlated Subquery是一个使用外部值的子查询   查询。 在这种情况下,必须为每一行执行内部查询   外部查询。

select ename,deptno 
from emp1 
where exists 
(select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);

您可以将其重写为:

select e.ename, e.deptno 
from emp1 e
join dpt d
  on d.deptno = e.deptno
where d.deptno > 20;

第二个查询(非相关/简单子查询):

  

非相关子查询是子查询,独立于外部   查询,它可以独立执行,而不依赖于主外部   查询。

select ename,deptno 
from emp1 
where exists 
  (select deptno from dpt where deptno>20);

等同于(如果存在某些子查询):

select ename,deptno 
from emp1 
where 1 = 1

或者(如果子查询没有返回):

select ename,deptno 
from emp1 
where 1 = 0