子查询中的内连接

时间:2012-05-08 09:55:48

标签: sql oracle11g oracle-sqldeveloper

有人可以解释以下查询之间的区别。子查询中的连接看起来相同,但第一个运行正常,第二个运行没有。在第二个查询中,子查询似乎无法访问别名表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;

3 个答案:

答案 0 :(得分:5)

第二个查询语法错误:

inner join  e
                    ON      d.deptno = e.deptno

无法使用表别名进行内部联接。

答案 1 :(得分: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;

答案 2 :(得分:0)

子查询只能使用来自更高级别表的标量值,这些表本身不在范围内 - 您可以将子查询视为为更高级别表的每一行执行的循环。