度量快速开发平台-专业、快速的软件定制快开平台

标题: oracle 中的exists [打印本页]

作者: fteair    时间: 2020-5-28 17:39
标题: oracle 中的exists
[size=13.3333px]Where exists
首先,从网上查询了很多资料。意思大致如下。
exists 返回值只是标记或者说一个标识的意思,并不会返回任何的数据。
Exists 是一个判断条件。判断 后续的语句 是否有返回值。有则为true。
返回为 true 的情况下 where 之前的语句则成立。
判断 后续语句 无返回值 则为 flase
where 之前的语句不成立。也就是不返回值。
[size=13.3333px]第二,用 exists 的相关子查询
子查询中的 查询条件 依赖于外层父查询的某个属性值,称这类查询为相关子查询。求解相关子查询不能像求解不相关子查询一样,(这里,我的理解是不相关子查询是与父查询完全独立的查询。)。相关子查询,一定要一条一条,结合出父查询中的条件,遍历出结果。
如下为几个例子。
empp 创建语句为
create table empp as select from emp where deptno=20;
select
from emp where exists (select 1 from empp where emp.deptno=empp.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
[size=13.3333px]
[size=13.3333px]
  7369 SMITH      CLERK           7902 17-JAN-81        800                    20
  7566 JONES      MANAGER         7839 02-MAY-81       2975                    20
  7788 SCOTT      ANALYST         7566 19-MAY-87       3000                    20
  7876 ADAMS      CLERK           7788 23-JUN-87       1100                    20
  7902 FORD       ANALYST         7566 03-JAN-82       3000                    20

[size=13.3333px]查询结果如我们所说。先去找父表(emp)中第一条记录,然后匹配deptno的值。然后找emp 第二条记录,知道遍历完emp表所有的记录。
这就是我理解的相关子查询。
另外之前我一直犯傻使用的格式为如下所示,希望大家不要再犯。
select * from emp where exists (select 1 from empp,emp where emp.deptno=empp.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
[size=13.3333px]
[size=13.3333px]
  7369 SMITH      CLERK           7902 17-JAN-81        800                    20
  7499 ALLEN      SALESMAN        7698 20-MAR-81       1600        300         30
  7521 WARD       SALESMAN        7698 22-MAR-81       1250        500         30
  7566 JONES      MANAGER         7839 02-MAY-81       2975                    20
  7654 MARTIN     SALESMAN        7698 28-OCT-81       1250       1400         30
  7698 BLAKE      MANAGER         7839 01-JUN-81       2850                    30
  7782 CLARK      MANAGER         7839 09-JUL-81       2450                    10
  7788 SCOTT      ANALYST         7566 19-MAY-87       3000                    20
  7839 KING       PRESIDENT            17-DEC-81       5000                    10
  7844 TURNER     SALESMAN        7698 08-OCT-81       1500          0         30
  7876 ADAMS      CLERK           7788 23-JUN-87       1100                    20
  7900 JAMES      CLERK           7698 03-JAN-82        950                    30
  7902 FORD       ANALYST         7566 03-JAN-82       3000                    20
  7934 MILLER     CLERK           7782 23-FEB-82       1300                    10

[size=13.3333px]乍一看我觉得我写的一点毛病没有。但是为什么遍历出来了所有记录呢,,最后思索了一下相关子查询这几个字。最后反应过来了。我这样写完了。exists中是一个完整的子查询。单独拿出来是完全可以执行的。因为之前已经说过。exists 是不返回具体的值的。它只负责判断。判断后续语句中是否有值,我这样一写就变成了不相关子查询。所以就遍历了exists前的语句。
所以相关子查询一定要和父查询中的条件关联起来。
最后给一个 相关查询为空不返回记录的例子,用做对比。
select * from emp where exists (select 1 from empp where deptno=10);
no rows selected


作者: fteair    时间: 2020-5-28 17:39

作者: 张兴康    时间: 2020-5-29 14:00

作者: fteair    时间: 2020-6-3 16:58
张兴康 发表于 2017-12-29 14:00


作者: fteair    时间: 2020-6-4 17:53





欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://plat.delit.cn/) Powered by Discuz! X3.2