Oracle Показывать только имя в deptno 20 - PullRequest
1 голос
/ 29 марта 2012

я наткнулся на следующий пример, в котором отображалось только название отдела занятости, присутствующее в 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

Удаление внешнего соединенияfrom (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 ]

2 голосов
/ 29 марта 2012

Прежде всего, пожалуйста, используйте стандартный синтаксис соединения 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, как правило, очень хорошо оценивает эти запросы и должна делать все правильно.

0 голосов
/ 29 марта 2012

Проверьте план запроса с помощью:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...