Tại sao một chức năng nhóm không phải nhóm đơn nhóm mà JET được phép trong một mục phụ nhưng không phải là chính nó?


9

Tại sao truy vấn đầu tiên không thất bại với lỗi tương tự như truy vấn thứ hai:

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:
*/

chỉnh sửa: thông tin phiên bản đã thêm:

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                 
*/

chỉnh sửa: thông số không mặc định được thêm vào:

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
*/

Bạn có thể tái tạo điều này trên một tập dữ liệu nhỏ trên sql fiddle không?
Philᵀᴹ

Tôi đoán đó là một lỗi trong trình phân tích / trình tối ưu hóa Oracle11 (có lẽ nó quá thông minh và bỏ qua product_idtrong chế độ xem nội tuyến). Cả hai đều thất bại trong Oracle10g ("không phải là chức năng nhóm đơn").
a1ex07

@Jack Bạn đang ở cấp độ vá nào?
Philᵀᴹ

@Phil SQLFiddle cho kết quả kỳ lạ tương tự (đó là 11.2.0.2 XE, tôi đang dùng 11.2.0.3 SE 64bit Linux)
Jack nói hãy thử topanswers.xyz

@ a1ex07 Tôi chắc chắn rằng bạn đúng, đó là một lỗi tối ưu hóa: select sum(units), avg(product_id) from (select product_id, sum(units) units from w);thất bại như mong đợi.
Jack nói hãy thử topanswers.xyz

Câu trả lời:


3

Tôi có thể nói đó là một lỗi trong phiên bản Oracle của bạn.

  • Trong 11.1.0.7.0, 9.2.0.7.011.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
    

Truy vấn con chắc chắn không hợp lệ. Có thể có một sự đơn giản hóa được thực hiện bởi trình tối ưu hóa trong việc hợp nhất hai truy vấn tổng hợp (như được đề xuất bởi @ a1ex07 ), nhưng việc hợp nhất không nên diễn ra trong mọi trường hợp vì truy vấn không đúng về mặt logic.

Có một số lỗi liên quan đến GROUP BYhành vi không chính xác được đăng nhập trong MOS, nhưng tôi không thể tìm thấy lỗi nào giống với lỗi này. Gần nhất tôi tìm thấy là Bug 8945974 trong đó một truy vấn không chính xác với một GROUP BYđang hoạt động 10.2.0.3và vá cơ sở dữ liệu để 10.2.0.4làm cho nó thất bại một cách thích hợp.


Linux 11,2 64 bit của bạn có giống của tôi không?
Jack nói hãy thử topanswers.xyz

Vâng, đó là từ trang web demo apex.oracle.com . Chính xác là cùng một v$versionthông tin!
Vincent Malgrat

Rất kỳ quặc. Có sự khác biệt đáng kể nào với tôi select name, value from v$parameter where isdefault = 'FALSE' order by name;không?
Jack nói hãy thử topanswers.xyz

Thật không may, tôi không có quyền truy cập vào quan điểm này trong trường hợp đó.
Vincent Malgrat

btw no_mergematerializegợi ý không làm cho bất kỳ sự khác biệt. Tôi nghĩ về mặt kỹ thuật, nó đang loại bỏ cột không sử dụng thay vì hợp nhất các truy vấn nhưng tôi đoán lỗi là nó không đưa ra lỗi phân tích trước.
Jack nói hãy thử topanswers.xyz

1

Tôi nghi ngờ rằng trình tối ưu hóa truy vấn đang áp dụng một chuyển đổi cho truy vấn đầu tiên của bạn để loại bỏ Product_id khỏi chế độ xem nội tuyến, sau đó hợp nhất chế độ xem nội tuyến vào truy vấn chính để thực hiện như sau:

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

Trên thực tế, có lẽ sau đó nó biến đổi nó thành:

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

Hai ví dụ của bạn có chung một kế hoạch (xem tại đâyđây ) nhưng bản gốc của tôi có một kế hoạch khác và sử dụng no_mergehoặc materializekhông tạo ra bất kỳ sự khác biệt nào, đó là lý do tại sao tôi nghĩ rằng CBO đang loại bỏ sản phẩm_id khỏi chế độ xem nội tuyến nhưng không hợp nhất xem nội tuyến vào truy vấn chính.
Jack nói hãy thử topanswers.xyz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.