2012-05-08 29 views
2

次のクエリの違いを説明できますか?サブクエリの結合は同じように見えますが、最初のクエリは正常に実行され、2番目のクエリは実行されません。 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

2番目のクエリは、不正な構文を持っていますインナー作る

inner join e 
        ON  d.deptno = e.deptno 

は表の別名で参加することはできません。

+0

クエリ1のサブクエリがテーブルエイリアス(e)の内部結合ではありませんか? – tp9

+0

いいえ。クエリ1では、where句を使用してemp(inner)テーブルに制限を設けています。この制限では、テーブルemp(外側)を使用して必要な情報を選択します。 –

+0

よろしくお願いします。それは多くの混乱を解消します。 – tp9

0

クエリ2は無効です。sql。 キーワードfromjoinは、タブ名とオプションのエイリアスで続ける必要があります。あなたが考えることができます -

は、クエリ2のため

可能修正

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

サブクエリのみが、スコープにはない高い平準化テーブル、これらのテーブル自体からスカラ値を使用することができます(ただし、クエリ1は、はるかに優れている) より高いレベルのテーブルの各行に対して実行するループとしてのサブクエリを含む。

関連する問題