【问题标题】:Inner joins in sub queries子查询中的内连接
【发布时间】:2012-05-08 09:55:47
【问题描述】:

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

查询 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;

【问题讨论】:

    标签: sql oracle11g oracle-sqldeveloper


    【解决方案1】:

    第二个查询语法错误:

    inner join  e
                        ON      d.deptno = e.deptno
    

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

    【讨论】:

    • 查询1中的子查询不是与表别名(e)的内连接吗?
    • 没有。在查询 1 中,您通过 where 子句对表 emp(内部)进行了限制。限制使用表emp(外)选择所需信息。
    • 好的,谢谢您的澄清。它消除了很多困惑。
    【解决方案2】:

    查询 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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 2013-04-26
        • 2021-09-25
        • 1970-01-01
        相关资源
        最近更新 更多