Sql SELECT UDAF(AGGR())中的奇怪行为
有两个select语句:Sql SELECT UDAF(AGGR())中的奇怪行为,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,有两个select语句: 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()vs.strconcat()
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()
vs.strconcat()
您可以用任何UDAF替换strconcat() 前一条语句按预期工作:它返回字符串
'a'
后一种说法:
-(在Oracle 10g上)给出错误的结果(null而不是字符串
'a'
)-(在Oracle 11g上)引发了
ORA-00979:不是按表达式分组的
我不理解此错误消息。
你能解释一下这种行为吗?
这是Oracle的错误吗?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:
好的,两个查询(我在这里使用listag
):
那么,这是一只虫子吗?我不知道。不幸的是,我不能将我的UDAF设置为“上”级,因为它位于相关子查询中(Oracle不支持深度为2的相关子查询)。我从未想到使用max(min(…)
,但显然它是有效的(在某些情况下)。使用min(min(min(…))
给了我ORA-00935:组函数嵌套太深了
(12.1.0.2.0),这也是我在双重调用情况下所期望的。
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>