`

《Pro Oracle SQL》Chapter7--7.10GROUP BY Restrictions

阅读更多

     7.10 GROUP BY的限制   (page 217)

    Your study of GROUP BY would be incomplete without considering what it cannot do.  The list of restrictions placed on GROUP BY is not very long.  The restrictions are listed in the Oracle 11.2 SQL  Language Reference for Oracle 11.2. For example:
•  LOB columns, nested tables, or arrays may not be used as part of a GROUP BY expression.
•  Scalar subquery expressions are not allowed.
•  Queries cannot be parallelized if the GROUP BY clause references any object type columns.

    如果你不知道GROUP BY不能做什么,那么你对它的学习是不完整的。对GROUP BY的限制列表不是很长。在Oracle 11.2SQL语言参考列出了对Oracle 11.2的限制。例如:
•  LOB 列,嵌套表, 或者数组可能不能被用做GROUP BY表达式的一部分。
•  标量子查询也是不允许的。
•  如果GROUP BY子句引用任何对象类型的列,查询不能并行化。 

    SQL queries were constructed to demonstrate the first two restrictions as shown in Listing 7-20 and 7-21.   The error messages clearly show that LOB columns and scalar subqueries cannot be used as part of GROUP BY clause.
    列表7-20和7-21所示,构造的SQL查询演示了前两个限制。错误消息清晰的说明LOB列和标量子查询不能被用做GROUP BY子句的一部分。
Listing 7-20.  GROUP BY Restrictions – LOB Not Allowed 
SQL> @l_7_2
  1  with lobtest as (
  2     select to_clob(d.dname ) dname
  3     from scott.emp e
  4     join scott.dept d on d.deptno = e.deptno
  5  )
  6  select l.dname
  7  from lobtest l
  8* group by l.dname
group by l.dname;
         *
ERROR at line 8:
ORA-00932: inconsistent datatypes: expected - got CLOB

Listing 7-21.  GROUP BY Restrictions – Scalar Subquery Not Allowed
  1  select d.dname, count(empno) empcount
  2  from scott.emp e
  3  join scott.dept d on d.deptno = e.deptno
  4  group by (select dname from scott.dept d2 where d2.dname = d.dname)
  5  order by d.dname;
group by (select dname from scott.dept d2 where d2.dname = d.dname);
          *
ERROR at line 4:
ORA-22818: subquery expressions not allowed here
 
    The final restriction listed appears to be a documentation error.  Evidence for that can be seen in
Listing 7-22 where the GROUP BY on an OBJECT datatype is being executed in parallel, contrary to what the documentation states.  The member function match in the dept_location type body is used to compare the value for city, and this in turn is used by GROUP BY to group employees by CITY. Should you need to create aggregations based on data in an OBJECT column, you can certainly do so as of Oracle 11.1.0.7. Testing has shown that the GROUP BY of Listing 7-22 will not be executed in parallel in Oracle 11.1.0.6. 
    所列的最后一个限制看起来像一个文档错误。列表7-22所示证实,GROUP BY的OBJECT数据类型并行执行了,相比文档所述。dept_location_type体中的成员函数match用于比较city的值,进而又被GROUP BY用于按CITY分组employees。 你能基于一个OBJECT列的数据创建聚合么?Oracle 11.1.0.7一定能做到。测试显示列表7-22中的GROUP BY在Oracle 11.1.0.6中不能并行执行。

Listing 7-22. GROUP BY on Object Column in Parallel
SQL> create type dept_location_type
  2  as object
  3    (
  4      street_address     VARCHAR2(40)
  5      , postal_code        VARCHAR2(10)
  6      , city               VARCHAR2(30)
  7      , state_province     VARCHAR2(10)
  8      , country_id         CHAR(2)
  9      , order member function match (e dept_location_type) return integer
 10  );
 11  /
 
Type created.
 
SQL>
SQL> create or replace type body dept_location_type
  2  as order member function match (e dept_location_type) return integer
  3  is
  4    begin
  5      if city < e.city then
  6        return -1;
  7      elsif city > e.city then
  8        return 1;
  9      else
 10        return 0; 
11      end if;
 12    end;
 13  end;
 14  /
 
Type body created.
 
SQL>
SQL> create table deptobj
  2  as
  3  select d.deptno,d.dname
  4  from scott.dept d;
Table created.
SQL> alter table deptobj add (dept_location dept_location_type);
Table altered.
SQL> update deptobj set dept_location =
  2    dept_location_type('1234 Money St', '97401','Eugene', 'OR', 'US')
  3  where deptno=20;
1 row updated.
SQL> update deptobj set dept_location =
  2    dept_location_type('459 Durella Street', '97463','Oakridge', 'OR', 'US')
  3  where deptno=40;
1 row updated.
SQL> update deptobj set dept_location =
  2    dept_location_type('12642 Rex Rd', '97006','Beavertown', 'OR', 'US')
  3  where deptno=10;
1 row updated. 
SQL> update deptobj set dept_location =
  2    dept_location_type('9298 Hamilton Rd', '97140','George', 'WA', 'US')
  3  where deptno=30;
1 row updated.
 
1 commit;
Commit complete.
PL/SQL procedure successfully completed.
 
  1  select /*+ gather_plan_statistics parallel(e 2)*/
  2    d.dept_location, count(e.ename) ecount
  3  from scott.emp e, deptobj d
  4  where e.deptno = d.deptno
  5  group by dept_location
  6  order by dept_location ;       -- (按match函数的返回值,分组,排序)
 DEPT_LOCATION(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVI       ECOUNT
------------------------------------------------------------                    ------
DEPT_LOCATION_TYPE('1234 Money St', '97401', 'Eugene', 'OR', 'US')             5
DEPT_LOCATION_TYPE('12642 Rex Rd', '97006', 'Beavertown','OR','US')           3
DEPT_LOCATION_TYPE('9298 Hamilton Rd', '97140', 'George','WA','US')            6
3 rows selected.
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
| Id  | Operation                                               | Name           | Starts | E-Rows | A-Rows |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT                            |                     |      1    |             |      3 |
|   1 |   PX COORDINATOR                             |                     |      1   |             |      3 |
|   2 |     PX SEND QC (ORDER)                     | :TQ10002      |      0   |     14    |      0 |
|   3 |       SORT GROUP BY                           |                     |      0   |     14    |      0 |
|   4 |          PX RECEIVE                                |                     |      0    |     14   |      0 |
|   5 |            PX SEND RANGE                       | :TQ10001     |      0    |     14   |      0 |
|   6 |               HASH GROUP BY                   |                     |      0    |     14   |      0 |
|*  7 |                 HASH JOIN                           |                     |      0     |     14   |      0 |
|   8 |                    BUFFER SORT                  |                     |      0     |           |      0 |
|   9 |                      PX RECEIVE                    |                     |      0    |      4   |      0 |
|  10 |                       PX SEND BROADCAST  | :TQ10000     |      0    |      4   |      0 |
|  11 |                          TABLE ACCESS FULL  | DEPTOBJ    |      1     |      4   |      4 |
|  12 |                    PX BLOCK ITERATOR       |                    |      0     |     14   |      0 |
|* 13 |                      TABLE ACCESS FULL     | EMP             |      0     |     14   |      0 |
--------------------------------------------------------------------------- 
(译者注:使用Oracle 11.2.0运行上面的查询,报错:ORA-12801:并行查询服务器P001中发出错误信号 ORA-04063: type bod "SYS.DEPT_LOCATION_TYPE"有错误 )


Summary
    Oracle has provided some excellent tools for the SQL practitioner in the form of extensions to the GROUP BY clause. Not only do they reduce code, they improve database efficiency.  They do, however, take some dedication and practice to learn how best to use them.  The introduction here to advanced grouping features is by no means comprehensive.  Most of these features can be combined for many different effects, far more than is practical to include in a book.  Please endeavor to make use of these features in your own applications and continue to experiment with them based on what you have learned here. 

总结
    Oracle已经为SQL实践者以GROUP BY扩展式的形式提供了一些卓越的工具。不仅可以减少代码量而且能提高数据库的性能。它们需要你花些时间和精力来学习如何最佳使用它们。这里所介绍的高级分组特性并不复杂。大部分这些特性能组合而形成多种效果,远超出一本书所包含的实例。请在你自己的应用中努力用到这些特性,把你在这里所学的不断应用于实践。

1
0
分享到:
评论

相关推荐

    常见病虫识别样本-数据集

    来自2021年软件杯A4赛道的数据集,同时我们自己在网上搜集到了对应害虫的幼虫形态,总共15种害虫,同时对每一种害虫都做了标注,存放在Annotations文件里面。 注意:数据分为图片和Xml文件,xml文件里面是框框的坐标,数据有点少,大家也可以自行添加一点,有几个XML文件是空的。

    餐馆点餐管理系统-数据库课程设计-MySQL

    《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累

    校园服务平台系统 2025免费毕设附带论文 SpringBoot+Vue.js

    2025免费毕设附带论文 SpringBoot+Vue.js 启动教程: https://www.bilibili.com/video/BV11ktveuE2d/?share_source=copy_web 二开教程:https://www.bilibili.com/video/BV18i421i7Dx/?share_source=copy_web 讲解视频:https://www.bilibili.com/video/BV1Tb421n72S/?share_source=copy_web

    BlueCoreTM3-Flash:蓝牙2.4GHz系统的单芯片射频与基带IC集成电路解决方案 蓝牙技术

    内容概要:本文详细介绍了BlueCoreTM3-Flash,一款专为蓝牙2.4GHz系统设计的单芯片射频和基带IC。文章首先概述了BlueCoreTM3-Flash的基本特性,包括高集成度、高速处理能力和大容量内存。接着深入探讨了其底层驱动程序和固件代码的设计,展示了如何通过寄存器操作、中断处理和数据处理来实现高效的蓝牙通信和数据传输。最后,文章列举了BlueCoreTM3-Flash在智能耳机、智能手表等多种蓝牙设备中的实际应用场景,强调了其在物联网和智能设备领域的广泛应用前景。 适合人群:对蓝牙技术和集成电路感兴趣的电子工程师、硬件开发者和技术爱好者。 使用场景及目标:①了解BlueCoreTM3-Flash的技术特性和优势;②掌握其底层驱动程序和固件代码的工作原理;③探索其在各类蓝牙设备中的具体应用。 其他说明:本文基于CSR公司的官方资料和技术文档,旨在帮助读者全面理解BlueCoreTM3-Flash的功能及其在蓝牙设备中的重要地位。

    基于COMSOL欧拉-欧拉模型的气固流化床仿真技术解析

    内容概要:本文详细介绍了欧拉-欧拉模型在气固流化床仿真中的应用,重点探讨了该模型如何通过COMSOL仿真软件捕捉气固两相流的复杂交互行为。文章解释了欧拉-欧拉模型的基本原理,即把不同相视为连续介质,以便更精确地模拟和分析各相间的交互作用。文中还强调了COMSOL的强大计算能力和丰富的物理模型库,使得复杂多相流问题得以高效解决。此外,文章讨论了该模型在化工生产中的具体应用场景,如作为反应器或催化剂载体的气固流化床的设计和优化。 适合人群:从事化学工程、流体力学及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解气固流化床内部流动状态和反应过程的研究项目,旨在优化设备设计和提高生产效率。 其他说明:本文不仅提供了理论背景,还涉及实际操作步骤,包括建模、设定边界条件以及仿真计算,有助于读者全面掌握相关技术和方法。

    疫情防控专题网站系统 2025免费毕设附带论文 SpringBoot+Vue.js

    2025免费毕设附带论文 SpringBoot+Vue.js 启动教程: https://www.bilibili.com/video/BV11ktveuE2d/?share_source=copy_web 二开教程:https://www.bilibili.com/video/BV18i421i7Dx/?share_source=copy_web 讲解视频:https://www.bilibili.com/video/BV1Tb421n72S/?share_source=copy_web

    基于BERT、CRF和BiLSTM的知识图谱医生推荐系统的Python代码及文档与数据集

    毕业设计基于BERT+CRF+BiLSTM知识图谱实现的医生推荐系统,提供python源码、文档说明及数据集。本项目适合计算机相关专业的学生用于毕设或项目实战练习,也可作为课程设计或期末大作业使用。项目经过严格调试,确保可以运行。。内容来源于网络分享,如有侵权请联系我删除。

    宠物商城网站 2025免费毕设附带论文 SpringBoot+Vue.js

    2025免费毕设附带论文 SpringBoot+Vue.js 启动教程: https://www.bilibili.com/video/BV11ktveuE2d/?share_source=copy_web 二开教程:https://www.bilibili.com/video/BV18i421i7Dx/?share_source=copy_web 讲解视频:https://www.bilibili.com/video/BV1Tb421n72S/?share_source=copy_web

    bugreport-2025-05-19-222057.zip

    bugreport-2025-05-19-222057.zip

    基于ADRC控制的Matlab Simulink半车主动悬架建模及其与PID控制的性能对比 ADRC控制 基于ADRC控制的Matlab Simulink半车主动悬架建模:效果对比与输出分析

    内容概要:本文详细探讨了基于ADRC(自抗扰控制)的Matlab Simulink半车主动悬架建模方法及其控制效果。文章首先介绍了半车主动悬架模型的重要性,然后深入讲解了ADRC控制的基本原理及其在悬架系统中的应用。ADRC控制通过自我抗扰实现了对系统的精确控制,尤其适用于非线性、时变和不确定的系统。文中还展示了ADRC控制在车身加速度、悬架动挠度和轮胎动变形等方面的优化表现,并将其与传统的PID控制进行对比,结果显示ADRC控制在复杂路况下表现出显著优势。最后,文章提供了具体的Matlab/Simulink建模和仿真实验步骤,验证了ADRC控制的有效性。 适合人群:汽车工程专业学生、从事车辆控制系统研究的研究人员和技术人员。 使用场景及目标:①理解和掌握ADRC控制在半车主动悬架中的应用;②评估ADRC控制相对于传统PID控制的优势;③利用Matlab/Simulink进行悬架系统建模和仿真。 其他说明:本文不仅提供了理论分析,还包括实际的建模和仿真实例,有助于读者全面理解ADRC控制的实际应用。

    《基于安卓平台的单词学习助手应用开发》

    在安卓开发领域,通过 Android Studio 构建实用的“单词本”应用是一个极具代表性的项目。该应用主要面向学生、语言学习者以及其他希望提升词汇量的用户,旨在帮助他们高效学习和记忆英语单词。 安卓移动开发专注于为安卓设备(如智能手机和平板电脑)开发应用程序。Android Studio 作为谷歌官方推荐的集成开发环境(IDE),提供了代码编辑器、调试器、构建系统和模拟器等强大工具,极大地提升了开发效率。 在“单词本”项目中,Android Studio 的直观界面和丰富功能得到了充分体现。开发者可以利用 XML 设计用户界面,同时使用 Java 或 Kotlin 编写业务逻辑,实现如添加、删除、复习单词等功能。 应用的核心功能包括: 数据存储:采用 SQLite 数据库存储单词及其含义。SQLite 是轻量级的数据库管理系统,可直接嵌入应用中,无需服务器支持。 用户界面:通过多个活动(Activity)展示不同功能,例如主界面显示单词列表,详情页展示单词详细信息,复习界面用于测试用户记忆。 UI 设计:使用 XML 布局文件定义控件布局和样式。Android Studio 的布局编辑器还支持可视化设计,方便开发者操作。 事件处理:通过为按钮等控件设置监听器,响应用户操作(如点击事件),实现添加、删除单词等功能。 通知与提醒:利用安卓的通知 API 和 AlarmManager 服务,提醒用户定期复习单词。 测试与调试:借助 Android Studio 的调试工具,开发者可以进行单元测试和集成测试,设置断点、查看变量值、跟踪代码执行流程,从而发现并修复问题。 开发过程中,Android 模拟器可用于测试应用。模拟器能够模拟不同设备型号和操作系统版本,帮助开发者评估应用的兼容性和性能。 此外,“报告.doc”文件通常详细记录了项目的整体情况,包括目标、设计思路、实现过程

    全自动化瓶盖封装机设备及其控制系统——基于西门子1200PLC与TP900触摸屏的应用

    内容概要:本文介绍了全自动化瓶盖封装机设备的构成和技术应用,特别是博图15.1技术、西门子1200PLC和TP900触摸屏程序的作用。设备由机架、驱动系统、夹具、封装头等部分组成,利用传感器和编码器实现精准封装。博图15.1实现了设备的实时监控、故障诊断和自动报警。西门子1200PLC负责精确控制并与其他设备通信,而TP900触摸屏提供了便捷的操作界面。此外,还提供了视频教程、CAD图纸、PDF文档和IO表等辅助材料,帮助用户理解和操作设备。 适合人群:从事工业自动化设备研发、制造、维护的技术人员,尤其是对PLC编程和人机界面感兴趣的工程师。 使用场景及目标:适用于需要详细了解全自动化瓶盖封装机设备的工作原理和技术细节的专业人士,旨在提高设备的运行效率和稳定性,便于操作和维护。 其他说明:文中提供的多种辅助资料有助于深入理解设备的功能和操作方法,对于实际应用有重要指导意义。

    Delphi 12.3控件之Mitov Runtime version 8-0-0-142 source.rar

    Delphi 12.3控件之Mitov Runtime version 8_0_0_142 source.rar

    基于Simulink仿真的FOC电流环PI参数自整定模型:电机控制系统优化与智能化升级 电机控制 FOC电流环PI参数自整定Simulink仿真模型

    内容概要:本文详细介绍了基于Simulink仿真的FOC电流环PI参数自整定模型及其应用。首先阐述了FOC电流环PI参数自整定的基本原理,即通过传感器输出的角度和速度信息,利用PI控制器实现对电流的精确控制,并根据电机实际运行状态自动调整比例系数和积分系数。接着,重点介绍了该模型的特点,如采用有感FOC控制最小系统、支持无传感器控制升级、标幺值系统便于参数调整、离散式步长仿真确保准确性、模块化结构利于二次开发、所有参数随用随改以及电流环PI参数自动整定。最后,讨论了该模型在电机控制策略研究、不同负载特性的测试以及教育领域的应用价值。 适合人群:从事电机控制技术研发的专业人士、高校师生及相关研究人员。 使用场景及目标:①研究和测试各种电机控制策略;②模拟不同负载特性,评估电机性能;③帮助学生理解和掌握电机控制原理及FOC控制技术。 其他说明:文中提及的PI参数自整定原理参考了知乎的相关文章,提供了进一步的学习资源。

    毕业设计-智慧农场小程序 1.8.9-整站商业源码.zip

    毕业设计-智慧农场小程序 1.8.9-整站商业源码.zip

    爱国评论数据生成及可视化

    生成了评论数据集,根据评论绘制了词云图和情感分析柱状图。

    自创mrt搭建图纸,狙击枪,很帅,真的很帅,需要备课

    韩端mrt,机器人搭建图,这个课常规都不好上,所以建议还是及时换教具,狙击枪使用起来会有bug,如果绳子缠着了,自行松一下就行

    用面对对象求圆和长方形的面积周长.zip

    用面对对象求圆和长方形的面积周长.zip

    毕业设计-景区旅游多商户版3.4.4-整站商业源码.zip

    毕业设计-景区旅游多商户版3.4.4-整站商业源码.zip

Global site tag (gtag.js) - Google Analytics