Subquery Factoring 子查询分解
(page 305)
Jared Still
You may not be familiar with the term subquery factoring . Prior to the release of Oracle 11gR2, the
official Oracle documentation barely mentions it, providing just a brief synopsis
of its use, a couple of
restrictions, and a single example. If I instead refer to the WITH clause of the SELECT statement, you will probably know immediately what I mean as this term is more recognizable. Both terms will be used in
this chapter.
你可能不熟悉术语“子查询分解”。在Oracle11gR2发行之前,Oracle官方文档很少提及它,只是提供了它使用的简要大纲
,一些限制条件,和一个例子。如果我是指SELECT语句的WITH子句,你可能马上明白我的意思了,因为这个术语很熟悉。在本章中两个术语都用到了。
With the release of Oracle 11gR2 (version 11.2), the WITH clause was enhanced with the ability to
recurse; that is, the factored subquery is allowed to call itself within some limitation. The value of this
may not be readily apparent. If you have used the CONNECT BY clause to create hierarchical queries, you will appreciate that recursive subqueries allow the same functionality to be implemented in an ANSI
standard format.
随着Oracle11gR2的发布(版本11.2),WITH子句增强了递归的能力,就是,分解的子查询允许在某些限定内调用自身。这点的价值可能不是那么明显。如果你使用CONNECT BY子句创建等级查询,你就会赞赏递归子查询,允许用ANSI标准格式执行相同的功能。
If the term subquery factoring is not known to you, perhaps you have heard of the ANSI Standard
term common table expression
(commonly called CTE). Common table expressions were first specified
in the 1999 ANSI SQL Standard. For some reason, Oracle has chosen to obfuscate
this name. Other
database vendors refer to common table expressions, so perhaps Oracle chose subquery factoring just to
be different.
如果数据子查询分解不为你熟知,可能你听说过ANSI标准数据公有表表达式
(一般称之为CTE)。公有表表达式首次在1999 ANSI
SQL标准中规定。由于某些原因,Oracle选择混淆
这个名字。其他的数据厂商指公有表表达式,因此可能Oracle选择子查询分解只是为了有所区别。
注: Factoring 在数学上的意思是“因式分解” ,
以后均简称“分解”。pivot本意是“绕...旋转”,但是很多书将这里的PIVOT翻译成“转置”,使人同线性代数中的转置(transpose)混淆,实际上两个不同的概念。本人喜欢直接称之为"旋转"。
PIVOT参考:http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html
http://www.cnblogs.com/tracy/archive/2011/08/24/2151613.html
Standard Usage 标准用法
One of the most useful features of the WITH clause when it was first introduced was to cleanup complex SQL queries. When a large number of tables and columns are involved in a query, it can become difficult to follow the flow of data through the query. Via the use of subquery factoring, a query can be made more understandable by moving some of the complexity away from the main body of the query.
WITH子句最有用的特性之一就是它的引入首先清理复杂的SQL查询。当查询中涉及大量的表和列,把握查询的数据的流向就变得困难了。通过使用子查询分解,把一些复杂部分移出查询主体,使得查询变得更好理解。
The query in Listing 10-1 generates a crosstab report using the PIVOT operator. The formatting helps
make the SQL somewhat readable, but there is quite a bit going on here. The innermost query is creating
a set of aggregates on key sales columns, while the next most outer query simply provides column names
that are presented to the PIVOT operator, where the final values of sales by channel and quarter for each product are generated.
在列表10-1中的查询生成一交叉表报告使用PIVOT操作符。格式化有助于SQL更可读,但是还是很长。最里面的查询创建一组聚合在键sales
列上,而次外层查询简单的提供列名给PIVOT操作符,生成每款产品(product)按渠道(channel)和季度(quarter)分的销售
(sales)的最终值。
Listing 10-1. Crosstab without Subquery Factoring 没有子查询分解的交叉表
select *
from (
select /*+ gather_plan_statistics */
product
, channel
, quarter
, country
, quantity_sold
from
(
select
prod_name product
, country_name country
, channel_id channel
, substr(calendar_quarter_desc, 6,2) quarter
, sum(amount_sold) amount_sold
, sum(quantity_sold) quantity_sold
from
sh.sales
join sh.times on times.time_id = sales.time_id
join sh.customers on customers.cust_id = sales.cust_id
join sh.countries on countries.country_id = customers.country_id
join sh.products on products.prod_id = sales.prod_id
group by
prod_name
, country_name
, channel_id
, substr(calendar_quarter_desc, 6, 2)
)
) PIVOT
(
sum(quantity_sold)
FOR (channel, quarter) IN
(
(5, '02') AS CATALOG_Q2,
(4, '01') AS INTERNET_Q1,
(4, '04') AS INTERNET_Q4,
(2, '02') AS PARTNERS_Q2,
(9, '03') AS TELE_Q3
)
)
order by product, country;
Now let’s use the WITH clause to break the query in byte-sized chunks that are easier to comprehend. The SQL has been rewritten in Listing 10-2 using the WITH clause to create three subfactored queries, named sales_countries , top_sales , and sales_rpt . Notice that both the top_sales and sales_rpt subqueries are referring to other subqueries by name, as if they were a table or a view. By choosing names that make the of each subquery easy to follow, the readability of the SQL is improved. For instance, the subquery name sales_countries refers to the countries in which the sales took place, top_sales collects the sales data, and the sales_rpt subquery aggregates the data. The results of the sales_rpt subquery are used in the main query which answers the question, “What is the breakdown of sales by product and country per quarter?”
If you were not told the intent of the SQL in Listing 10-1, it would take some time to discern its purpose; on the other hand, the structure of the SQL in Listing 10-2 with subfactored queries makes it easier to understand the intent of the code.
现在让我们使用WITH子句将查询分解成字节大小的块,容易理解。在列表10-2中SQL用WITH语句重写,创建了三个子查询,名为
sales_countries , top_sales , 和sales_rpt。注意子查询top_sales 和sales_rpt
两者都按名称引用了其它的子查询,好像它们是一个表或者视图。通过选择适当的名称使得每个子查询容易理解,SQL的可读性也提高了。例如,子查询名为
sales_countries
指的是销售发生的国家,top_sales收集销售额数据,而sales_rpt子查询聚集数据。子查询sales_rpt
的结果用于主查询回答问题,“每季度按产品和国家分的销售额明细是什么?”
如果你没有告知列表10-1中SQL的意图,将花费好些时间领悟它的意思;另一方面,在列表10-2中的SQL结构带有分解的子查询使得它的代码更容易被理解。
In addition, the statements directly associated with the PIVOT operator are in the same section of the SQL statement at the bottom, further enhancing readability.
再者,语句直接关联了PIVOT操作符,在SQL语句的底部相同的段。进一步增加了可读性。
Listing 10-2. Crosstab with Subquery Factoring 带子查询因子的交叉表
with sales_countries as
(
select /*+ gather_plan_statistics */
cu.cust_id
, co.country_name
from sh.countries co, sh.customers cu
where cu.country_id = co.country_id
),
top_sales as
(
select
p.prod_name
, sc.country_name
, s.channel_id
, t.calendar_quarter_desc
, s.amount_sold
, s.quantity_sold
from
sh.sales s
join sh.times t on t.time_id = s.time_id
join sh.customers c on c.cust_id = s.cust_id
join sales_countries sc on sc.cust_id = c.cust_id
join sh.products p on p.prod_id = s.prod_id
),
sales_rpt as
(
select
prod_name product
, country_name country
, channel_id channel
, substr(calendar_quarter_desc, 6,2) quarter
, sum(amount_sold) amount_sold
, sum(quantity_sold) quantity_sold
from top_sales
group by
prod_name
, country_name
, channel_id
, substr(calendar_quarter_desc, 6, 2)
)
select * from
(
select product, channel, quarter, country, quantity_sold
from sales_rpt
) pivot
(
sum(quantity_sold)
for (channel, quarter) in
(
(5, '02') as catalog_q2,
(4, '01') as internet_q1,
(4, '04') as internet_q4,
(2, '02') as partners_q2,
(9, '03') as tele_q3
)
)
order by product, country;
While this is not an extremely complex SQL example, it does serve to illustrate the point of how the
WITH clause can be used to make a statement more readable and easier to maintain. Large complex
queries can be made more understandable by using this technique.
虽然这不是一个极其复杂的SQL例子,但是它示例出WITH语句如何能够使得语句更可读和容易维护。大而复杂的查询可通过使用这种技术变得更为可理解。
分享到:
相关推荐
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 损成本 等约束 程序+算法+参考文献
计算机组成原理课程设计任务书 2021-3-1修订版1
单向辐射ugr模型 包含单向辐射电场模,上下表面辐射损耗,能带,q因字。
光伏锂电池储能功率协调控制系统仿真 [1]左侧光伏Boost控制部分:采用扰动观察法来进行MPPT最大功率跟踪,其中可以改变光照和温度模拟环境工况阶跃: [2]锂电池双向Buck_Boost:采用双闭环控制策略,给定负载电压外环,电流内环,通过稳定负载电压从而控制电流进行充放电 [3]负载电压能够稳定在设定值48V,锂离子电池对功率进行功率协调补偿 仿真运行工况模式: (1)当外界光照变弱,光伏输出功率不能满足负载所需功率,储能会放电进行补偿功率 (2)当外界光照变强,光伏输出功率超过负载所需功率,多余的功率储能会充电进行储存
激光熔覆数值模拟 COMSOL仿真 双椭球热源 采用双椭球热源模型,考虑材料热物性参数、相变、马兰戈尼效应、布辛涅斯克近似等,动网格模拟熔覆层,计算瞬态温度场和流场。
multisim学习Multisim2001电路设计及仿真入门与应用附带光盘含大量实例提取方式是百度网盘分享地址
HFI高频注入仿真 直接转矩控制,滑模观测器MATLAB仿真模型
拿来就用的张定友标定法实验报告,特别详细和完整 一、实验目的 3 二、实验器材 3 三、 张正友标定法原理 3 四、实验步骤 4 4.1 整体流程 4 4.2图像采集 4 4.3特征点提取 5 4.4相机标定 5 4.5畸变校正 6 五、 实验结果 6 5.1 内参矩阵K 6 5.2 畸变系数D 7 5.3 外参矩阵 和 7 5.4 标定误差的计算 8 六、实验结论 9 6.1标定结果的准确性与图像数量密切相关 9 6.2标定图像的分布与角度多样性对标定结果的影响 9 6.3重投影误差的评估 9 6.4畸变系数的准确性 9 6.5OpenCV 工具的使用简便性: 9 七、参考文献 10 八、附件 11
内容概要:本篇文章基于 Flask 框架讲解了一个具体的 API 接口实现方法,该接口用于触发特定ID关联的应用程序运行流程(利用Docker容器执行指定的应用Python脚本)。具体地,在接收 POST 请求之后,根据提供的应用ID来检索对应应用程序的相关路径、镜像名称与主脚本的位置等信息,并且尝试将应用程序目录及其相关联的数据目录挂载进一个临时创建出来的docker环境内以运行主要入口脚本,整个执行过程限定在一小时内完成。一旦成功则把结果以 JSON 包的形式发送回客户端,若是出现错误情况,如找不到对应的 App 或者在执行时发生异常或是超出了时限都将给予相应的JSON报错回复。 适用人群:有一定网络编程以及 Flask 框架使用基础的人群,特别是有志于深入研究 Python 网络服务器构建,掌握如何集成外部组件或容器化应用程序来提升业务处理能力的学生或者是工程师。 使用场景及目标:为用户提供一种简易但实用的方式让 Flask Web 应用可以异步地调用位于远端或本地机器上的 Docker 容器内的脚本来开展某些任务,如进行长时间的数据处理作业或是调用第三方工具等。
HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制,0速带载启动,堵转保持扭矩 低速HFI, 高速SMO,全速域运行。 基于stm32f405。 高频注入零速启动三步走: 1 .先是高频注入,角度估算收敛。 2.脉冲NS磁极辨识。 3 .角度,速度双闭坏零速启动运行。 包括完整的cubemx配置文件,mdk工程,原理图和开发笔记,初始角度检测仿真,代码全C语言,宏定义选项均有中文注释,方便我植到自己的项目中。 内涵升级版hfi程序和新的foc程序框架,新版hfi程序速度波动更小。
数据来源:基于上市公司公告、年报等相关数据整理计算 数据范围:沪深京上市公司A股,包括主板、中小企业板、创业板、科创板、北京证交所服务板块等 数据详情: https://blog.csdn.net/yushibing717/article/details/144893810 包含六大类数据: 1、上市公司研究报告发布机构关联表20010101-20240929: ReportID [研究报告编码] - 自动生成的一组序列 Title [标题] - 研究报告的标题 DeclareDate [发布日期] - 研报对外发布日期 InstitutionName [发布机构名称] - 如果一个研报对应多个发布机构,分多条录入 2、上市公司研究报告分类关联表20010101-20240929: 3、上市公司研究报告基本信息20010101-20240929 4、上市公司研究报告人员关联表20010101-20240929 5、上市公司研究报告行业关联表20060703-20240929 上市公司研究报告证券关联表20010101-20240929.......
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
GEC6818 人脸检测
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
内容概要:本文档是一份详尽的轨道交通信号与控制专业的综合实验指导手册,涵盖了五个主要实验项目,旨在帮助学生深入理解和实践轨道交通领域的关键技术。具体内容包括ZPW-Z000轨道电路信号的FSK调制与解调、机车信号噪声干扰、应答器报文编制与CRC校验。每个实验详细介绍了目的、原理、任务及实验步骤,同时提供了实验报告要求。通过这些实验,学生们能够全面了解和掌握轨道交通信号系统的工作机制和核心技术。 适用人群:高等院校电气与控制工程学院的本科生、研究生,以及从事轨道交通信号与控制系统研究的技术人员。 使用场景及目标:适用于课堂教学、实验课程和研究项目,帮助学生和研究人员掌握轨道电路信号的FSK调制与解调技术,理解噪声对机车信号的影响及应对措施,熟悉应答器报文的设计与CRC校验机制。目标是提高学生的动手能力、实验技能和理论素养,培养他们解决实际问题的能力。 其他说明:该实验手册不仅为学生提供了详细的实验指南,还为教师和实验技术人员提供了一套科学的教学和实验工具,有助于提升教学质量。同时,这些实验也为未来的研究和发展打下了坚实的基础。
基于 OpenCV 和 Angular Velocity 读数的高精度算法,该算法可以从五个不同的视频中重现汽车的方向盘角度。
简易高考志愿填报辅助工具(含源码与说明).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!