Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SELECT UDAF(AGGR())中的奇怪行为_Sql_Oracle_Oracle11g_Oracle10g - Fatal编程技术网

Sql SELECT UDAF(AGGR())中的奇怪行为

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语句:

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>