Почему первый запрос не завершается с той же ошибкой, что и второй:
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
*/
edit: нестандартные параметры добавлены:
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
Джек говорит, попробуйте topanswers.xyz
источник
источник
product_id
при встроенном просмотре). Оба они терпят неудачу в Oracle10g («не групповая функция одной группы»).select sum(units), avg(product_id) from (select product_id, sum(units) units from w);
как и ожидалось.Ответы:
Я бы сказал, что это ошибка в вашей версии Oracle.
В
11.1.0.7.0
,9.2.0.7.0
и11.2.0.3.0
:Подзапрос, безусловно , не действует. Оптимизатор может упростить слияние двух агрегатных запросов (как предложено @ a1ex07 ), но слияние не должно происходить ни в коем случае, поскольку запрос не является логически корректным.
В
GROUP BY
MOS зарегистрировано несколько ошибок, связанных с некорректным поведением, но я не смог найти ту, которая выглядит именно этой. Ближайший я нашел Bug 8945974 , где неправильный запрос сGROUP BY
работал в10.2.0.3
и исправлении базы данных для10.2.0.4
сделали это надлежащим образом не в состоянии .источник
v$version
информация!select name, value from v$parameter where isdefault = 'FALSE' order by name;
?no_merge
иmaterialize
намеки не имеют никакого значения. Я думаю, что технически это устраняет неиспользуемый столбец, а не объединяет запросы, но я предполагаю, что ошибка заключается в том, что он сначала не выдает ошибку разбора.Я подозреваю, что оптимизатор запросов применяет к вашему первому запросу преобразование, которое исключает product_id из встроенного представления, а затем объединяет встроенное представление с основным запросом, который выполняется следующим образом:
На самом деле, он, вероятно, затем преобразует его в:
источник
no_merge
илиmaterialize
не имеет никакого значения, поэтому я думаю, что CBO исключает product_id из встроенного представления, но не объединяет встроенный вид в основной запрос.