oracle中的with as语法

语法:
WITH query_name AS (subquery)
     [, query_name AS (subquery) ]...
使用在主select关键字前,oracle将其当做一个内联视图或者临时表使用。

例子:

1.   最简单的使用方法:

如查询部门名称包含“A”的所有员工信息

01--with clause
02  
03with a as
04  
05(select deptno from dept where dname like '%A%')
06  
07select * from emp where deptno in (select * from a); 
08  
09with a as
10  
11(select deptno from dept where dname like '%A%'),--a结果集
12  
13a2 as(select * from a where deptno>20)--a1结果集直接从a中筛选
14  
15select * from emp where deptno in (select * from a2);

 

2.   多层同级只能用一个with,并且后面的结果集可以使用前面的结果集:

查询部门名称包含“A”并且部门编号大于20的所有员工信息

1with a as
2  
3(select deptno from dept where dname like '%A%'),--a结果集
4  
5a2 as(select * from a where deptno>20)--a1结果集直接从a中筛选
6  
7select * from emp where deptno in (select * from a2);

 

3.   不同级查询可以使用多个with

查询部门名称包含“A”并且部门编号大于20的所有员工信息的另外一种实现方式如下

01with a as
02  
03(select deptno from dept where dname like '%A%')--a结果集
04  
05select * from emp where deptno in (--括号内层作为子查询,为第二级
06  
07with a2 as(select * from a where deptno>20)--a1结果集直接从a中筛选
08  
09select * from a2
10  
11);

 

使用场景:

那什么情况下能使用到with子句呢?以下我就举几个简单的例子,简单的说明以下:

1.         我想测试一句sql,而我不想专门建立一个测试表:

我想测试成绩大于90的学生,我不想建立学生表,可以用到with子句

01with stu as(
02  
03select '张娜' sname,99 score from dual union
04  
05select '王杰' ,35  from dual union
06  
07select '宋丽' ,85  from dual union
08  
09select '陈晓' ,73  from dual union
10  
11select '李元' ,100  from dual
12  
13)--with 组成一个临时的结果集,存放在用户的临时表空间
14  
15select  * from stu where score>90

2.         当一个sql重复用到某个相同的结果集作为子查询:

--查询销售部工资>1500或者销售部工资小于1000的员工

01select * from emp where deptno=(select deptno from dept where dname ='SALES') and sal >1500
02  
03union all
04  
05select * from emp where deptno=(select deptno from dept where dname ='SALES') and sal <1000
06  
07--以上sql select deptno from dept where dname ='SALES'需要执行两次,影响效率
08  
09--可以使用with优化一下
10  
11with salno as(select deptno from dept where dname ='SALES')
12  
13select * from emp where deptno=(select * from salno) and sal >1500
14  
15union all
16  
17select * from emp where deptno=(select * from salno) and sal <1000

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14385647/viewspace-749493/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14385647/viewspace-749493/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值