oracle with table as的用法整理




WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。

特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

1. with table as 可以建立临时表,一次分析,多次使用

2. 对于复杂查询,使用with table as可以抽取公共查询部分,多次查询时可以提高效率

3. 增强了易读性

with table as 相当于建个临时表(用于一个语句中某些中间结果放在临时表空间的SQL语句),

Oracle 9i 新增WITH语法,可以将查询中的子查询命名,放到SELECT语句的最前面。

语法
with tempname as (select ....)
 select ...

例子:
with t as (select * from emp where depno=10)
 select * from t where empno=xxx

with wd as (select did,arg(salary) 平均工资 from work group by did),
 em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)
 select * from wd,em where wd.did =em.did and wd.平均工资>em.salary;

 注意:这个临时表只能用于查询,不能用于更新

with table_temp as (
select b.filename,count(*) ct from originalsalesdata o,salesdatafile b
where o.salesdatafileid = b.salesdatafileid
and to_char(b.startdate,'yyyymm')='201705' and to_char(b.enddate,'yyyymm')='201705'
group by b.filename
)
select distinct(t.filename),t.ct from table_temp t, table_temp t2
where t.filename <> t2.filename and t.ct = t2.ct
order by t.ct desc;

参考:

http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html

http://blog.csdn.net/feier7501/article/details/24460279

http://www.cnblogs.com/wishyouhappy/p/3684148.html

http://blog.csdn.net/feier7501/article/details/21811319


你可能感兴趣的:(数据库,Database)