Dlaczego pierwsze zapytanie nie kończy się tym samym błędem co drugie:
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:
*/
edycja: dodano informacje o wersji:
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
*/
edycja: dodano parametry inne niż domyślne:
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
*/
oracle
oracle-11g-r2
Jack mówi, że spróbuj topanswers.xyz
źródło
źródło
product_id
w widoku wbudowanym). Oba zawodzą w Oracle10g („nie jest to funkcja grupy jednej grupy”).select sum(units), avg(product_id) from (select product_id, sum(units) units from w);
kończy się niepowodzeniem zgodnie z oczekiwaniami.Odpowiedzi:
Powiedziałbym, że to błąd w twojej wersji Oracle.
W
11.1.0.7.0
,9.2.0.7.0
i11.2.0.3.0
:Podkwerenda zdecydowanie nie jest poprawna. Optymalizator może uprościć połączenie dwóch agregowanych zapytań (jak sugeruje @ a1ex07 ), ale scalanie nie powinno mieć miejsca, ponieważ zapytanie nie jest logicznie poprawne.
Istnieje kilka błędów związanych z nieprawidłowym
GROUP BY
zachowaniem zalogowanych w MOS, ale nie mogłem znaleźć takiego, który wygląda dokładnie tak. Najbliższy znalazłem to Bug 8945974 gdzie niepoprawne zapytania zGROUP BY
pracowała w10.2.0.3
i łatanie bazę danych10.2.0.4
sprawiły, że właściwie nie.źródło
v$version
informacje!select name, value from v$parameter where isdefault = 'FALSE' order by name;
?no_merge
imaterialize
podpowiedzi nie mają znaczenia. Myślę, że technicznie to raczej eliminuje nieużywaną kolumnę niż scalanie zapytań, ale wydaje mi się, że błąd polega na tym, że nie generuje najpierw błędu analizy.Podejrzewam, że optymalizator zapytań stosuje transformację do pierwszego zapytania, która eliminuje identyfikator_produktu z widoku wbudowanego, a następnie łączy widok wbudowany z głównym zapytaniem, które wykonuje jako:
W rzeczywistości prawdopodobnie przekształca to dalej w:
źródło
no_merge
lubmaterialize
nie robi żadnej różnicy, dlatego myślę, że CBO eliminuje product_id z widoku wbudowanego, ale nie łączy widok wbudowany w główne zapytanie.