2015-09-27 166 views
2

查詢1EXISTS子句和JOIN

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

返回ENAME對應於在子查詢

查詢2

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

施加在DEPTNO字段的條件,但在查詢2中的結果包含字段ename和deptno的所有值

什麼更改了這兩個查詢中的結果集?是因爲加入嗎?實際上,聯接如何在查詢1中引入不同的結果集?爲什麼查詢1中不考慮where條件,而不是查詢2?

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

回答

4

第一查詢是相關子

相關子查詢是使用值從外 查詢的子查詢。 在這種情況下,必須針對外部查詢的每個行 執行內部查詢。

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 
+0

我真的很感謝你解釋事情的方法。所以基本上相關的子查詢是當外部查詢中的表與子查詢中的表之間存在關係(聯合)時?非常感謝你的迴應。 –

+1

@ManushreeMishra相關子查詢是當您從子查詢引用到外部查詢時。在你的示例'where dpt.deptno = emp1.deptno'中。線索是相關的子查詢是從外部查詢執行的每一行和不相關的執行一次 – lad2025

+0

所以引用基本上是由內部連接完成,或者也可以這樣做:emp.deptno在子查詢中? –