2012-05-08 127 views
2

有人可以請解釋以下查詢之間的區別。子查詢中的連接看起來相同,但第一次運行正常,第二次沒有。在第二個查詢中,子查詢似乎無法訪問別名表e。內部加入子查詢

QUERY1

select e.ename 
      ,e.deptno 
      ,(
       select count(*) 
       from emp d 
       where e.deptno = d.deptno 
     ) dept_cnt 
from  emp e 
order by 2; 

QUERY 2

select e.ename 
      ,e.deptno 
      ,(
       select count(*) 
       from emp d 
       inner join e 
        ON  d.deptno = e.deptno 
      ) dept_cnt 
from  emp e 
order by 2; 

回答

5

第二個查詢有壞的語法:

inner join e 
        ON  d.deptno = e.deptno 

製作的內用表別名加入是不可能的。

+0

是不是查詢1中的子查詢與表別名(e)的內部聯接? – tp9

+0

否。在查詢1中,您正在通過where子句對錶emp(內部)進行限制。限制使用表emp(外部)來選擇所需的信息。 –

+0

好的,謝謝你的澄清。它清除了很多混亂。 – tp9

0

查詢2是無效的sql。 關鍵字fromjoin必須後跟表名和可選別名。

查詢2可能的修復程序(但查詢1要好得多)

select e.ename 
     ,e.deptno 
     ,(
      select count(*) 
      from emp d 
      inner join emp e1 
      ON d.deptno = e1.deptno 
      AND e1.deptno = e.deptno 
     ) dept_cnt 
from emp e 
order by 2; 
0

子查詢只能使用標量值從較高平整的表,這些表,本身不進的範圍 - 你能想到的子查詢作爲循環執行更高級別表的每一行。