一、WITH 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短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。
二、举个简单的例子
with a as (select * from test)
select * from a;
其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它
这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了。
三、测试一下:
SQL> with
2 sql1 as (select * from t2),
3 sql2 as (select * from t3)
4 select * from t2
5 union
6 select * from t3;
sql2 as (select * from t3)
*
ERROR at line 3:
ORA-32035: unreferenced query name defined in WITH clause
--从这里可以看到,你定义了sql1和sql2,就得用它们哦,不然会报错的。
SQL> with
2 sql1 as (select * from t2),
3 sql2 as (select * from t3)
4 select * from sql1
5 union
6 select * from sql2;
ID
----------
1
2
3
--下面加个WHERE条件试试
SQL> with
2 sql1 as (select * from t2),
3 sql2 as (select * from t3)
4 select * from sql1
5 union
6 select * from sql2
7 where id in(2,3);
ID
----------
1
2
3
--奇怪?为什么加了WHERE条件还是输出ID=1的记录了,继续往下看:
SQL> with
2 sql1 as (select * from t2),
3 sql2 as (select * from t3)
4 select * from sql1
5 where id=3
6 union
7 select * from sql2
8 where id=3;
ID
----------
3
--可以看到,每个条件是要针对每个SELECT语句的。