我遇到了以下的前任,只显示了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
吗?
答案 0 :(得分:2)
首先请使用标准的ANSI连接语法...
您与众不同的原因是实际的加入条件是inner join
,e.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