WITH AS的用法

一、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语句的。  

上面基本就是with as 的基本用法。

转自:https://blog.csdn.net/wanghai__/article/details/4776631  

https://www.cnblogs.com/superyinhai/archive/2010/04/09/1708643.html

你可能感兴趣的:(Oracle,数据库关键字)