目录
一、简介
1、with as 是做什么的?
Oracle查询中的with as子句相当于创建一个临时表,将一个语句中的某些中间结果放在临时表空间。将查询中的子查询命名,放到SELECT语句的最前面。语法如下:
with temptablename([字 段列表]) as (select ...)select ...
2、wtih功能
with..as关键字,是以‘with’关键字开头的sql语句,在实际工作中,我们经常会遇到同一个查询sql会同时查询多个相同的结果集,即sql一模一样,这时候我们可以将这些相同的sql抽取出来,使用with..as定义。
with..as时一张临时表,可以简单理解为sql片段(类似java复用代码)。
3、with优点
增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。
第一种使用子查询的方法表被扫描了两次,而使用WITH Clause方法,表仅被扫描一次。这样可以大大的提高数据分析和查询的效率。
另外,观察WITH Clause方法执行计划,其中“SYS_TEMP_XXXX”便是在运行过程中构造的中间统计结果临时表。
二、使用方法
1、多次使用抽取出来
--with as 可以理解为一张临时表或者理解成sql片段,在多次查询语句相同的时候可以抽取出来,达到'一次解析,多次使用'
--如果每个部分都去执行一遍的话,则成本比较高,可以使用with as短语,则只要执行一遍即可
with temp as
(select '10001' as province_code from dual)
select case
when (select * from temp) = '10001' then
'equals'
when (select * from temp) = '10002' then
'not equals'
else
'unknown'
end is_equals
from dual;
2、在union 语句中使用
--with as 非常适合在union 语句中
--注意:with as 语句最后面不能加分号,否则报缺失select关键字错误。
with temp1 as
(select 'female' sex, 'zhangsan' stu_name from dual),
temp2 as
(select 'male' sex, 'lisi' stu_name from dual),
temp3 as
(select 'female' sex, 'wangwu' stu_name from dual)
select * from temp1
union all
select * from temp2
union all select * from temp3
注意点:with..as后面不能加分号,否则报错。
3、注意点:
(1)不能只定义with..as语句,定义了要使用它,否则会报错
--只定义with..as会报错
with temp1 as
(select 'female' sex, 'zhangsan' stu_name from dual),
temp2 as (select 'male' sex, 'lisi' stu_name from dual)
with temp1 as
(select 'female' sex, 'zhangsan' stu_name from dual),
temp2 as (select 'male' sex, 'lisi' stu_name from dual),
temp3 as (select * from temp2)
select * from temp1
union all
select * from temp2
union all
select * from temp3
二、总结
with..as其实就是将经常需要查询的语句抽取出来,形成一个虚拟表,我们后面可以多次使用,达到‘一次解析,多次使用’的效果,大大提高执行的效率。
转:https://blog.csdn.net/qq_18975791/article/details/102882141