Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle仅在deptno 20中显示记录的部门名称_Sql_Oracle - Fatal编程技术网

Sql Oracle仅在deptno 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

我遇到了以下例子,只显示部门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

检查查询计划:

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并没有短路逻辑的概念,所以您无法真正保证哪个语句的计算结果是“第一”。我会想象你加入第二个会被强迫成为一个内在的加入。