Странное поведение в SELECT UDAF (AGGR ()) - PullRequest
0 голосов
/ 27 августа 2018

Существует два оператора выбора:

select       max(min(str)) from (select 0 id, 'a' str from dual) group by id having min(str) = 'a';
select strconcat(min(str)) from (select 0 id, 'a' str from dual) group by id having min(str) = 'a';

Единственное отличие - агрегатная функция внешнего уровня: max() против strconcat().
Вы можете заменить strconcat() на любой свой UDAF.

Предыдущий оператор работает как положено: он возвращает строку 'a'.
Последнее утверждение:
- (в Oracle 10g) дает неправильный результат (ноль вместо строки 'a')
- (на Oracle 11g) повышает ORA-00979: not a GROUP BY expression

Я не понимаю это сообщение об ошибке.
Не могли бы вы объяснить это поведение?
Это ошибка Oracle?

1 Ответ

0 голосов
/ 27 августа 2018

10g:

Похоже, что WM_CONCAT, доступный мне (да, недокументированный, но не имеет значения в данном случае) или STRCONCAT, который вы используете (или, возможно, некоторые другие функции), нужно поставить на уровень "вверх"; см. этот пример:

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

SQL> select       max(min(str)) result
  2  from (select 0 id, 'a' str from dual)
  3  group by id having min(str) = 'a';

R
-
a

SQL> -- returns NULL, just as you've said
SQL> select wm_concat(min(str)) result
  2  from (select 0 id, 'a' str from dual)
  3  group by id having min(str) = 'a';

RESULT
---------------------------------------------------------------------


SQL> -- but, if we put it a level "up", the result is OK
SQL> select wm_concat(minstr) result
  2  from (select min(str) minstr
  3        from (select 0 id, 'a' str from dual)
  4        group by id having min(str) = 'a'
  5       );

RESULT
---------------------------------------------------------------------
a

SQL>

11g:

ОК, оба запроса (я использую listagg здесь):

SQL> select       max(min(str)) result
  2  from (select 0 id, 'a' str from dual)
  3  group by id having min(str) = 'a';

R
-
a

SQL>
SQL> select listagg(min(str), ',') within group (order by null) result
  2  from (select 0 id, 'a' str from dual)
  3  group by id having min(str) = 'a';

RESULT
-----------------------------------------------------------------------
a

SQL>

Итак, это ошибка? Я бы не знал.

...