为什么子选择中允许使用“非单组分组功能”,而不能单独使用?


9

为什么第一个查询不会失败并显示与第二个相同的错误:

with w as (select 1 product_id, 10 units from dual union all select 2, 5 from dual)
select sum(units) from (select product_id, sum(units) units from w);

/*
SUM(UNITS)
----------
        15 
*/

with w as (select 1 product_id, 10 units from dual union all select 2, 5 from dual)
select product_id, sum(units) units from w;

/*
Error starting at line 7 in command:
with w as (select 1 product_id, 10 units from dual union all select 2, 5 from dual)
select product_id, sum(units) units from w
Error at Command Line:8 Column:8
Error report:
SQL Error: ORA-00937: not a single-group group function
00937. 00000 -  "not a single-group group function"
*Cause:    
*Action:
*/

编辑:添加的版本信息:

select * from v$version;
/*
BANNER                                                                         
--------------------------------------------------------------------------------
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production                        
PL/SQL Release 11.2.0.3.0 - Production                                           
CORE    11.2.0.3.0  Production                                                         
TNS for Linux: Version 11.2.0.3.0 - Production                                   
NLSRTL Version 11.2.0.3.0 - Production                 
*/

编辑:添加了非默认参数:

select name, value from v$parameter where isdefault = 'FALSE' order by name;
/*
NAME                              VALUE                                                                                                                             
--------------------------------- ----------------------------------------------------------------------------------------------------------------------------------
aq_tm_processes                   1                                                                                                                                 
archive_lag_target                3600                                                                                                                              
audit_file_dest                   /u01/app/oracle/admin/oracle/adump                                                                                                
audit_trail                       NONE                                                                                                                              
compatible                        11.2.0.3                                                                                                                          
control_file_record_keep_time     31                                                                                                                                
control_files                     /home/oracle/cfile/controlfile.dat, +DATA/oracle/controlfile/current.915.730988607, +FRA/oracle/controlfile/current.970.730988607 
core_dump_dest                    /u01/app/oracle/admin/oracle/cdump                                                                                                
db_block_size                     4096                                                                                                                              
db_create_file_dest               +DATA                                                                                                                             
db_domain                                                                                                                                                           
db_file_multiblock_read_count     1                                                                                                                                 
db_name                           oracle                                                                                                                            
db_recovery_file_dest             +FRA                                                                                                                              
db_recovery_file_dest_size        375809638400                                                                                                                      
diagnostic_dest                   /u01/app/oracle                                                                                                                   
dispatchers                       (PROTOCOL=TCP) (SERVICE=oracleXDB)                                                                                                
event                                                                                                                                                               
filesystemio_options              setall                                                                                                                            
global_names                      TRUE                                                                                                                              
job_queue_processes               10                                                                                                                                
log_archive_dest_1                                                                                                                                                  
log_archive_dest_10               LOCATION=USE_DB_RECOVERY_FILE_DEST MANDATORY REOPEN=60                                                                            
log_checkpoint_timeout            30                                                                                                                                
memory_max_target                 36507222016                                                                                                                       
memory_target                     36507222016                                                                                                                       
nls_language                      ENGLISH                                                                                                                           
nls_length_semantics              BYTE                                                                                                                              
nls_territory                     UNITED KINGDOM                                                                                                                    
open_cursors                      300                                                                                                                               
pga_aggregate_target              0                                                                                                                                 
processes                         150                                                                                                                               
remote_login_passwordfile         EXCLUSIVE                                                                                                                         
sga_max_size                      32212254720                                                                                                                       
sga_target                        0                                                                                                                                 
shared_pool_size                  536870912                                                                                                                         
smtp_out_server                   mailout.redacted.com                                                                                                                   
streams_pool_size                 1073741824                                                                                                                        
undo_management                   AUTO                                                                                                                              
undo_retention                    900                                                                                                                               
undo_tablespace                   TS_UNDO                                                                                                                           

 41 rows selected
*/

能否在sql小提琴上的小型数据集上重现此内容?
菲尔(Philᵀᴹ)2013年

我猜这是Oracle11解析器/优化器中的错误(它可能太聪明了,product_id在嵌入式视图中会忽略 )。它们都在Oracle10g中失败(“不是单组组功能”)。
a1ex07

@Jack您的补丁级别是多少?
菲尔(Phil

@Phil SQLFiddle给出相同的奇数结果(它是11.2.0.2 XE,我使用的是11.2.0.3 SE 64位Linux)
杰克说请尝试topanswers.xyz 2013年

@ a1ex07我确定您是对的,这是一个优化程序错误:select sum(units), avg(product_id) from (select product_id, sum(units) units from w);按预期失败。
杰克说请尝试topanswers.xyz 2013年

Answers:


3

我会说这是您的Oracle版本中的错误。

  • 11.1.0.7.09.2.0.7.0并且11.2.0.3.0

    SQL> with w as (
      2  SELECT 1 product_id, 10 units FROM dual
      3  UNION ALL
      4  SELECT 2, 5 FROM dual)
      5  SELECT SUM(units) FROM (SELECT product_id, SUM(units) units FROM w);
    
    ORA-00937: not a single-group group function

子查询是绝对合法。优化器可能会简化合并两个聚合查询的过程(如@ a1ex07所建议),但是由于查询在逻辑上不正确,因此无论如何都不应进行合并。

关于GROUP BYMOS中记录的错误行为,存在一些错误,但是我找不到一个看起来与此完全相同的错误。我发现的最接近的错误错误8945974,其中存在一个错误的查询,GROUP BY正在使用10.2.0.3并修补数据库以10.2.0.4使其正确失败。


您的11.2 64位Linux是否像我的?
杰克说请尝试topanswers.xyz 2013年

是的,它来自apex.oracle.com演示网站。完全一样的v$version信息!
Vincent Malgrat 2013年

很奇怪。与我select name, value from v$parameter where isdefault = 'FALSE' order by name;有何重大差异?
杰克说请尝试topanswers.xyz 2013年

不幸的是,我无法在该实例上访问此视图。
Vincent Malgrat

顺便说一句,no_mergematerialize提示没有任何区别。我认为从技术上讲,这是在消除未使用的列,而不是合并查询,但是我猜这个错误是,它不会首先引发解析错误。
杰克说请尝试topanswers.xyz 2013年

1

我怀疑查询优化器正在将转换应用于您的第一个查询,该转换从内联视图中消除了product_id,然后将内联视图合并到主查询中,执行如下:

with w as (select 1 product_id, 10 units from dual union all select 2, 5 from dual)
select sum(units) from w;

实际上,它然后可能会将其进一步转换为:

select sum(units) from (select 10 units from dual union all select 5 from dual);

您的两个示例共享相同的计划(请参阅此处此处),但是我的原始示例具有不同的计划,并且使用no_mergematerialize并没有任何区别,这就是为什么我认为CBO从内联视图中删除product_id而不合并内联视图进入主查询。
杰克说请尝试topanswers.xyz 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.