度量快速开发平台-业界最好的全功能软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 160|回复: 4

[分享] oracle 中的exists

[复制链接]

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
发表于 2017-12-28 17:39:21 | 显示全部楼层 |阅读模式
[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

回复

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2017-12-28 17:39:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

542

主题

5919

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
发表于 2017-12-29 14:00:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-1-3 16:58:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

231

主题

2541

帖子

5807

积分

论坛元老

Rank: 8Rank: 8

积分
5807
 楼主| 发表于 2018-1-4 17:53:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2018-6-23 02:33 , Processed in 0.372646 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表