|
原帖由 ocpdba591 于 2010-9-4 11:44 发表 ![]()
不知楼主说的结果是不是语句执行顺序问题:
scott@orcl>select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';
ENAME DNAME
---------- --------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT RESEARCH
KING
TURNER
ADAMS
JAMES
FORD
MILLER
已选择14行。
其实上面的语句我们主要关注下on和left outer join的执行顺序就可以理解了:
首先要知道on 是优先于left outer join先执行的
所以on过滤掉的emp表结果,最后又被left outer join拿了回来。
scott@orcl>select e.ename,d.dname from emp e left outer join dept d on e.deptno=d.deptno where e.ename='SCOTT';
ENAME DNAME
---------- --------------
SCOTT RESEARCH
上面的语句就不一样了,where 是在left outer join后执行的,所以是最终的过滤结果。
按照楼主的说法,由于 on起不到过滤的作用
select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno and e.ename='SCOTT';
和
select e.ename,d.dname from emp e left outer join dept d on d.deptno=e.deptno ;
的结果是等价的??
可不可以认为,新的语法就是刻意地把连接条件和过滤条件分开。
这样一来可以使逻辑更清晰。 |
|