oracle的cte,oracle CTE 简介 | 学步园
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 简介 | 学步园相关推荐
- oracle 的exp是什么,oracle中exp和imp是什么,oracle中exp和imp有何区别 | 学步园
oracle中exp和imp是什么,oracle中exp和imp有何区别.exp和imp的输入都是名字和值对:exp parameter_name=value 或exp parameter_name= ...
- sbt oracle,使用Oracle默认SBT接口测试磁带通道 | 学步园
使用Oracle默认SBT接口测试磁带通道 1.创建备份目录 [oracle@utf10g ~]$ mkdir -p /backup/sbt 2.使用RMAN连接目标数据库(即需要备份的数据库),此示 ...
- biee mysql_【Oracle BIEE学习笔记一】Oracle BIEE简介 | 学步园
一.Oracle BIEE架构 两大任务: 1.解释逻辑SQL查询和对适当的数据源写入相应的物理查询: 2.对物理结果集进行变换和组合,并执行最终计算. 二.Oracle BI资料库中的三层结构 1. ...
- oracle 存储过程 状态,查看ORACLE中正在运行的存储过程 | 学步园
1.如何查看ORACLE中正在运行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks ...
- oracle里返回值吗,Oracle有返回值的存储过程 | 学步园
创建一个有输入输出的存储过程: CREATE OR REPLACE PROCEDURE sp_pro8 (spno IN NUMBER,spName OUT VARCHAR2) IS BEGIN SE ...
- db platform mysql_数据库移植: 从Oracle移植到MySQL 注意databasePlatform | 学步园
采用Spring框架.JPA操作数据库开发一个小网站过程中,遇到需要将数据库从Oracle移植到MySQL,在进行单元测试时遇到如下错误: Internal Exception: com.mysql. ...
- oracle生成顺序编号,Oracle排序以及序号的输出 | 学步园
在一般Select语句中我们通过Order by ...Asc/Desc来进行排序.但是这种排序方式在输出时,不包含排序后的序号信息. 现在介绍一下Oracle中可以用于排序输出的方法. 1. RAN ...
- oracle 自动异地备份,实现Oracle异地数据自动备份方案 | 学步园
来源:网络/责编:编程入门 作者:不详 相关命令 文中主要用到三个命令,这里先单独介绍一下: export: 将数据库中数据备份成一个二进制系统文件,它有三种模式: 用户模式.表模式.整个数据库模式. ...
- oracle累计相加,oracle用sum函数实现累加 | 学步园
嘿嘿,虽然写了很多次,但是真正的明白会用还是需要时间阿 .. 下面来一起看看论坛里的一个oracle方面的问题: ====================Question=============== ...
最新文章
- 【重磅】Waymo无人车高层组团出走?CFO今日也走了!
- linux系统学习之vi编辑
- 线性表算法题库_数据结构与算法(线性表)练习题
- axure实现搜索功能_vue实现模糊搜索功能
- ajax对日期处理,AJAX获取服务器当前时间及时间格式输出处理
- 基本概念---part5
- Windows系统利用5次shift维权漏洞复现
- ES6——函数参数默认值
- linux内存管理之uboot第一步
- javascript电子书下载
- Android :安卓学习笔记之 Handler机制 的简单理解和使用
- Biotin-HHL,AL;生物素化朱顶红凝集素(HHL,AL)
- 【Web技术】1395- Esbuild Bundler HMR
- 剖析Apple Pay 它与支付宝究竟暧昧什么?
- 第十二周项目四----利用遍历思想求解图问题之输出一些简单回路
- Python之常用模块(待更新)
- word2013和wps使合并后的内容上下对齐
- DNSPod十问袁志远:智慧园区,被严重低估的To B赛道?
- Ubuntu备份还原
- 微信共享智能充电桩小程序开发功能方案
热门文章
- 使用c++,类实现求圆柱体体积
- weka矿产分布文件_矿产资源国情调查项目组参加技术培训视频会议
- 计算机毕业设计(附源码)python休闲网络宾馆管理
- vue 调用百度的UEditor富文本编辑器,本地运行没问题,打包后工具栏显示出错
- IBM developerWorks几个关注的主题
- 云来场景应用LiveApp疑遭“山寨”
- 用单片机解码红外遥控器
- 华为鸿蒙源码有多少,华为鸿蒙源码下载-华为鸿蒙下载v2.0 正式版-西西软件下载...
- java学习方法-浅谈软件开发的神速进步
- 获取图片地址的最后的图片名称