oracle 9i r2中引入了SQL-99中的with子句,它是一个实现子查询的工具,

我们可以用它来临时存储oracle经过计算得到的结果集。

with子句的作用有点类似global temporary tables,设计with子句目的,

是为提高复杂子查询的速度。下面是with子句的一些要点:

1.with子句应用于oracle 9i以及更高版本

2.正式的,with子句称作分解子查询

3.with子句应用于当一个查询被多次执行的情况

4.with子句对于递归查询也很有用(SQL-99,oracle不支持)

为了简单起见,下面的例子仅仅引用集合一次;

而with子句通常被用在一个查询中多次引用一个集合情况下。

--

with子句能够简化复杂的sql查询

在SQL-99中,我们可以用with子句来代替临时表。

oracle中的with子句一次性获得一个集合,并为其取一个名,

以便于我们在后面的查询中引用到它。

--

首先,SQL-99中的with子句让人很困惑,因为这个sql语句不是以select开始的;

然而,我们的查询语句可以以with子句开始,定义一个集合,在主查询中引用到集合,

它就好像一个"真正的表":

with subquery_name

as (

the aggregation SQL statement)

select (

query naming subquery_name);

--

回到我们过于简单化的例子,我们用with子句代替临时表(注意:通过使用global temporary table,

你会发现你的执行计划更优了,不过这取决于你的oracle版本):

WITH sum_sales AS(

select /*+ materialize */

sum(quantity) all_sales

from stores ),

number_stores AS(

select /*+ materialize */

count(*) nbr_stores

from stores ),

sales_by_store AS(

select /*+ materialize */

store_name,

sum(quantity) store_sales

from

store natural join sales )

SELECT store_name

FROM

store,

sum_sales,

number_stores,

sales_by_store

where

store_sales > (all_sales / nbr_stores);

--

注释掉了oracle中没有公开的实现提示;oracle中的实现提示是用来确定

在with子句内部创建的临时表是基于开销优化的。对于oracle 10g版本来说,

这是不必要的,但是它确保了这个表只被创建一次。

应该指出的是,with子句在oracle中并不是完全的起作用,

oracle的sql中就不支持用with来替代connect by的递归查询。

--

Here is an actual performance comparison of equivalent queries:

SQL> --*********************************************

SQL> -- Using subqueries

SQL> --*********************************************

SQL>

SQL> select

2 store_name,

3 sum(quantity) store_sales,

4 (select sum(quantity) from sales)/(select count(*) from store) avg_sales

5 from

6 store s,

7 sales sl

8 where

9 s.store_key = sl.store_key

10 having

11 sum(quantity) > (select sum(quantity) from sales)/(select count(*) from store)

12 group by

13 store_name

14 ;

----------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 31 | 4 (25)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 4 | | |

| 2 | TABLE ACCESS FULL | SALES | 100 | 400 | 2 (0)| 00:00:01 |

| 3 | SORT AGGREGATE | | 1 | | | |

| 4 | INDEX FULL SCAN | SYS_C003999 | 10 | | 1 (0)| 00:00:01 |

|* 5 | FILTER | | | | | |

| 6 | HASH GROUP BY | | 1 | 31 | 4 (25)| 00:00:01 |

| 7 | NESTED LOOPS | | 100 | 3100 | 3 (0)| 00:00:01 |

| 8 | TABLE ACCESS FULL | SALES | 100 | 900 | 2 (0)| 00:00:01 |

| 9 | TABLE ACCESS BY INDEX ROWID| STORE | 1 | 22 | 1 (0)| 00:00:01 |

|* 10 | INDEX UNIQUE SCAN | SYS_C003999 | 1 | | 0 (0)| 00:00:01 |

| 11 | SORT AGGREGATE | | 1 | 4 | | |

| 12 | TABLE ACCESS FULL | SALES | 100 | 400 | 2 (0)| 00:00:01 |

| 13 | SORT AGGREGATE | | 1 | | | |

| 14 | INDEX FULL SCAN | SYS_C003999 | 10 | | 1 (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

113 consistent gets //IO数量

--

SQL> --*********************************************

SQL> -- Using CTAS(create table as select)

SQL> --*********************************************

SQL> create table t1 as select sum(quantity) all_sales from sales;

Table created.

SQL> create table t2 as select count(*) nbr_stores from store;

Table created.

SQL> create table t3 as select store_name, sum(quantity) store_sales from store natural join sales group by store_name;

Table created.

SQL>

SQL> select

2 store_name

3 from

4 t1,

5 t2,

6 t3

7 where

8 store_sales > (all_sales / nbr_stores);

------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 61 | 6 (0)| 00:00:01 |

| 1 | NESTED LOOPS | | 1 | 61 | 6 (0)| 00:00:01 |

| 2 | MERGE JOIN CARTESIAN| | 1 | 26 | 4 (0)| 00:00:01 |

| 3 | TABLE ACCESS FULL | T1 | 1 | 13 | 2 (0)| 00:00:01 |

| 4 | BUFFER SORT | | 1 | 13 | 2 (0)| 00:00:01 |

| 5 | TABLE ACCESS FULL | T2 | 1 | 13 | 2 (0)| 00:00:01 |

|* 6 | TABLE ACCESS FULL | T3 | 1 | 35 | 2 (0)| 00:00:01 |

------------------------------------------------------------------------------

30 consistent gets

--

SQL> --*********************************************

SQL> -- Using the WITH clause

SQL> --*********************************************

SQL>

SQL> with

2 number_stores as

3 (select count(*) nbr_stores from store),

4 total_sales as

5 (select sum(quantity) all_sales from sales),

6 store_sales as

7 (select store_name, sum(quantity) sales from store natural join sales group by store_name)

8 select

9 store_name

10 from

11 number_stores,

12 total_sales,

13 store_sales

14 where

15 sales > (all_sales / nbr_stores);

-----------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-----------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 61 | 7 (15)| 00:00:01 |

| 1 | NESTED LOOPS | | 1 | 61 | 7 (15)| 00:00:01 |

| 2 | NESTED LOOPS | | 1 | 26 | 3 (0)| 00:00:01 |

| 3 | VIEW | | 1 | 13 | 1 (0)| 00:00:01 |

| 4 | SORT AGGREGATE | | 1 | | | |

| 5 | INDEX FULL SCAN | SYS_C003999 | 10 | | 1 (0)| 00:00:01 |

| 6 | VIEW | | 1 | 13 | 2 (0)| 00:00:01 |

| 7 | SORT AGGREGATE | | 1 | 4 | | |

| 8 | TABLE ACCESS FULL | SALES | 100 | 400 | 2 (0)| 00:00:01 |

|* 9 | VIEW | | 1 | 35 | 4 (25)| 00:00:01 |

| 10 | SORT GROUP BY | | 10 | 310 | 4 (25)| 00:00:01 |

| 11 | NESTED LOOPS | | 100 | 3100 | 3 (0)| 00:00:01 |

| 12 | TABLE ACCESS FULL | SALES | 100 | 900 | 2 (0)| 00:00:01 |

| 13 | TABLE ACCESS BY INDEX ROWID| STORE | 1 | 22 | 1 (0)| 00:00:01 |

|* 14 | INDEX UNIQUE SCAN | SYS_C003999 | 1 | | 0 (0)| 00:00:01 |

-----------------------------------------------------------------------------------------------

109 consistent gets

oracle的cte,oracle CTE 简介 | 学步园相关推荐

  1. oracle 的exp是什么,oracle中exp和imp是什么,oracle中exp和imp有何区别 | 学步园

    oracle中exp和imp是什么,oracle中exp和imp有何区别.exp和imp的输入都是名字和值对:exp parameter_name=value 或exp parameter_name= ...

  2. sbt oracle,使用Oracle默认SBT接口测试磁带通道 | 学步园

    使用Oracle默认SBT接口测试磁带通道 1.创建备份目录 [oracle@utf10g ~]$ mkdir -p /backup/sbt 2.使用RMAN连接目标数据库(即需要备份的数据库),此示 ...

  3. biee mysql_【Oracle BIEE学习笔记一】Oracle BIEE简介 | 学步园

    一.Oracle BIEE架构 两大任务: 1.解释逻辑SQL查询和对适当的数据源写入相应的物理查询: 2.对物理结果集进行变换和组合,并执行最终计算. 二.Oracle BI资料库中的三层结构 1. ...

  4. oracle 存储过程 状态,查看ORACLE中正在运行的存储过程 | 学步园

    1.如何查看ORACLE中正在运行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks ...

  5. oracle里返回值吗,Oracle有返回值的存储过程 | 学步园

    创建一个有输入输出的存储过程: CREATE OR REPLACE PROCEDURE sp_pro8 (spno IN NUMBER,spName OUT VARCHAR2) IS BEGIN SE ...

  6. db platform mysql_数据库移植: 从Oracle移植到MySQL 注意databasePlatform | 学步园

    采用Spring框架.JPA操作数据库开发一个小网站过程中,遇到需要将数据库从Oracle移植到MySQL,在进行单元测试时遇到如下错误: Internal Exception: com.mysql. ...

  7. oracle生成顺序编号,Oracle排序以及序号的输出 | 学步园

    在一般Select语句中我们通过Order by ...Asc/Desc来进行排序.但是这种排序方式在输出时,不包含排序后的序号信息. 现在介绍一下Oracle中可以用于排序输出的方法. 1. RAN ...

  8. oracle 自动异地备份,实现Oracle异地数据自动备份方案 | 学步园

    来源:网络/责编:编程入门 作者:不详 相关命令 文中主要用到三个命令,这里先单独介绍一下: export: 将数据库中数据备份成一个二进制系统文件,它有三种模式: 用户模式.表模式.整个数据库模式. ...

  9. oracle累计相加,oracle用sum函数实现累加 | 学步园

    嘿嘿,虽然写了很多次,但是真正的明白会用还是需要时间阿 .. 下面来一起看看论坛里的一个oracle方面的问题: ====================Question=============== ...

最新文章

  1. 【重磅】Waymo无人车高层组团出走?CFO今日也走了!
  2. linux系统学习之vi编辑
  3. 线性表算法题库_数据结构与算法(线性表)练习题
  4. axure实现搜索功能_vue实现模糊搜索功能
  5. ajax对日期处理,AJAX获取服务器当前时间及时间格式输出处理
  6. 基本概念---part5
  7. Windows系统利用5次shift维权漏洞复现
  8. ES6——函数参数默认值
  9. linux内存管理之uboot第一步
  10. javascript电子书下载
  11. Android :安卓学习笔记之 Handler机制 的简单理解和使用
  12. Biotin-HHL,AL;生物素化朱顶红凝集素(HHL,AL)
  13. 【Web技术】1395- Esbuild Bundler HMR
  14. 剖析Apple Pay 它与支付宝究竟暧昧什么?
  15. 第十二周项目四----利用遍历思想求解图问题之输出一些简单回路
  16. Python之常用模块(待更新)
  17. word2013和wps使合并后的内容上下对齐
  18. DNSPod十问袁志远:智慧园区,被严重低估的To B赛道?
  19. Ubuntu备份还原
  20. 微信共享智能充电桩小程序开发功能方案

热门文章

  1. 使用c++,类实现求圆柱体体积
  2. weka矿产分布文件_矿产资源国情调查项目组参加技术培训视频会议
  3. 计算机毕业设计(附源码)python休闲网络宾馆管理
  4. vue 调用百度的UEditor富文本编辑器,本地运行没问题,打包后工具栏显示出错
  5. IBM developerWorks几个关注的主题
  6. 云来场景应用LiveApp疑遭“山寨”
  7. 用单片机解码红外遥控器
  8. 华为鸿蒙源码有多少,华为鸿蒙源码下载-华为鸿蒙下载v2.0 正式版-西西软件下载...
  9. java学习方法-浅谈软件开发的神速进步
  10. 获取图片地址的最后的图片名称