하위 그룹에서 "단일 그룹이 아닌 그룹 기능"이 허용되지만 자체 기능이 아닌 이유는 무엇입니까?


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ᵀᴹ

Oracle11 파서 / 최적화 프로그램의 버그라고 생각합니다 (아마도 너무 똑똑하고 product_id인라인보기에서는 무시합니다 ). 둘 다 Oracle10g에서 실패합니다 ( "단일 그룹 그룹 기능이 아님").
a1ex07

@ 잭 어떤 패치 레벨입니까?
Philᵀᴹ

@Phil SQLFiddle가 동일한주는 이상한 결과를 (그것의 11.2.0.2 XE, 나는 11.2.0.3 SE 64 비트 리눅스에있어)
잭 topanswers.xyz 시도라고

@ a1ex07 나는 그것이 당신이 맞다는 것을 확신합니다. 그것은 최적화 버그입니다 : select sum(units), avg(product_id) from (select product_id, sum(units) units from w);예상대로 실패합니다.
잭 topanswers.xyz 시도라고

답변:


3

오라클 버전의 버그라고 말하고 싶습니다.

  • 에서 11.1.0.7.0, 9.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에 기록 된 잘못된 동작 과 관련하여 몇 가지 버그가 있지만 정확히 이와 같은 버그를 찾을 수 없습니다. 가장 가까운 I의 FOUND는 버그 8945974 A를 잘못된 쿼리가 어디 GROUP BY에서 일하고 10.2.0.3와의 데이터베이스 패치 10.2.0.4가 적절하게 실패했다입니다.


11.2 64 비트 Linux는 내 것과 비슷합니까?
잭 topanswers.xyz 시도라고

예, apex.oracle.com 데모 웹 사이트에서 제공됩니다. 정확히 같은 v$version정보!
Vincent Malgrat

매우 이상합니다. 나의 중요한 차이점은 무엇 select name, value from v$parameter where isdefault = 'FALSE' order by name;입니까?
잭 topanswers.xyz 시도라고

불행히도 나는 그 인스턴스 에서이보기에 액세스 할 수 없습니다.
Vincent Malgrat

BTW no_mergematerialize힌트는 어떤 차이가 없습니다. 기술적으로 쿼리를 병합하는 대신 사용되지 않는 열을 제거한다고 생각하지만 버그는 구문 분석 오류를 먼저 발생시키지 않는 것입니다.
잭 topanswers.xyz 시도라고

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_merge또는 materialize어떤 차이를하지 않습니다 나는 CBO는 인라인 뷰에서 PRODUCT_ID을 제거하지만 병합되지 않은 생각하는 이유 기본 쿼리에 대한 인라인보기.
잭 topanswers.xyz 시도라고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.