Oracle仅在deptno 20中显示dept_name记录

时间:2012-03-29 15:41:37

标签: sql oracle

我遇到了以下的前任,只显示了deptno 20中的就业部门名称:

     EMPNO ENAME          DEPTNO DNAME
---------- ---------- ---------- --------------
      7902 FORD               20 RESEARCH
      7876 ADAMS              20 RESEARCH
      7788 SCOTT              20 RESEARCH
      7566 JONES              20 RESEARCH
      7369 SMITH              20 RESEARCH
      7934 MILLER
      7839 KING
      7782 CLARK
      7900 JAMES
      7844 TURNER
      7698 BLAKE

     EMPNO ENAME          DEPTNO DNAME
---------- ---------- ---------- --------------
      7654 MARTIN
      7521 WARD
      7499 ALLEN

使用的查询是

select e.empno, e.ename, d.deptno, d.dname  
from emp e, dept d  where (e.deptno = d.deptno(+)) and d.deptno(+) = 20

从(e.deptno = d.deptno(+))中删除外部联接仅显示5行,但这是否也适用?

select e.empno, e.ename, d.deptno, d.dname  
from emp e, dept d  where (e.deptno = d.deptno) and d.deptno(+) = 20

是先评估d.deptno(+) = 20吗?

2 个答案:

答案 0 :(得分:2)

首先请使用标准的ANSI连接语法...

您与众不同的原因是实际的加入条件是inner joine.deptno = d.deptno。这意味着无论您做了什么 - 比如尝试将depno用作left outer join - 您已将查询转换为inner join

顺便说一句,在你的第一个查询中,将d.deptno放在where子句中会做同样的事情。

就个人而言,我会这样写:

select e.empno, e.ename, d.deptno, d.dname  
  from emp e
  left outer join ( select deptno, dname 
                      from dept 
                     where deptno = 20 )
    on e.deptno = d.deptno

Oracle通常非常擅长评估这些查询,并且应该做正确的事情。

答案 1 :(得分:0)

使用以下方法检查查询计划:

EXPLAIN PLAN FOR select e.empno, e.ename, d.deptno, d.dname  from emp e, dept d  where (e.deptno = d.deptno(+)) and d.deptno(+) = 20

EXPLAIN PLAN FOR select e.empno, e.ename, d.deptno, d.dname  from emp e, dept d  where (e.deptno = d.deptno) and d.deptno(+) = 20

更多信息:http://docs.oracle.com/cd/B10500_01/server.920/a96533/ex_plan.htm