Sql Oracle仅在deptno 20中显示记录的部门名称
我遇到了以下例子,只显示部门20号文件中员工的部门名称:Sql Oracle仅在deptno 20中显示记录的部门名称,sql,oracle,Sql,Oracle,我遇到了以下例子,只显示部门20号文件中员工的部门名称: EMPNO ENAME DEPTNO DNAME ---------- ---------- ---------- -------------- 7902 FORD 20 RESEARCH 7876 ADAMS 20 RESEARCH 7788 SCOTT 20 RESEARCH 75
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
?检查查询计划:
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
更多信息:首先,请使用标准的ANSI连接语法 产生差异的原因是实际连接条件是
内部连接
,e.deptno=d.deptno
。这意味着,无论您做什么—比如尝试使用depno
作为左外部联接
—您都已将查询转换为内部联接
顺便提一下,在第一个查询中,将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通常非常擅长评估这些查询,应该做正确的事情。我会避免像瘟疫一样编写这样的语句。除了使用隐式连接语法(通常被认为是反模式)之外,用于指定连接的专门构造并不到处受支持(无论如何,在DB2上不起作用)。SQL并没有短路逻辑的概念,所以您无法真正保证哪个语句的计算结果是“第一”。我会想象你加入第二个会被强迫成为一个内在的加入。