Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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/9.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
ORA-00935如何触发?了解Oracle SQL';s嵌套群函数法_Sql_Oracle_Oracle11g_Sqlplus - Fatal编程技术网

ORA-00935如何触发?了解Oracle SQL';s嵌套群函数法

ORA-00935如何触发?了解Oracle SQL';s嵌套群函数法,sql,oracle,oracle11g,sqlplus,Sql,Oracle,Oracle11g,Sqlplus,我使用的是SQL*Plus或Oracle 11g express,如果相关的话 我遇到了一些奇怪的事情,我想了解更多关于嵌套组函数的信息,因为我是SQL新手,我发现错误的讽刺之处及其解决方案很奇怪: 这不起作用 where t1.col1 = (select col1 from t2 having count(col2) = max(count(col2)) group by col1 ; where t1.col1 = (select col1 fro

我使用的是SQL*Plus或Oracle 11g express,如果相关的话

我遇到了一些奇怪的事情,我想了解更多关于嵌套组函数的信息,因为我是SQL新手,我发现错误的讽刺之处及其解决方案很奇怪:

这不起作用

where
t1.col1 =
    (select col1
    from t2
    having count(col2) = max(count(col2))
group by col1
;
where
t1.col1 =
    (select col1
    from t2
    having count(col2) =
        (select max(count(col2)) from t2 
        group by col1)
    group by t2.col1)
;
通过以上内容,我收到:

ORA-00935:组函数嵌套太深

这确实有效

where
t1.col1 =
    (select col1
    from t2
    having count(col2) = max(count(col2))
group by col1
;
where
t1.col1 =
    (select col1
    from t2
    having count(col2) =
        (select max(count(col2)) from t2 
        group by col1)
    group by t2.col1)
;
鉴于上述情况,我有两个问题:

1)编译器/应用程序究竟是如何/在何处变得混乱的

2)如果只是为了清楚起见,我是否正确地假设更深的子查询先“激发”,然后为上面的子查询返回一个值,从而完全跳过混乱

  • 编译器没有混淆

    错误只是提醒您聚合函数在该上下文中没有意义:

    having count(col2) = max(count(col2)
    
    HAVING子句在GROUP BY之后生效,因此
    COUNT(COL2)
    COL2
    列中针对
    col1
    的每个不同值的非空值计数。在
    col1
    的一个不同值的上下文中,
    MAX(COUNT(COL2))
    没有任何意义-如果
    COUNT(COL2)
    的结果是3,那么
    MAX(3)
    显然是3-但在这里,编译器足够聪明,知道您可能并不打算这样做

    因此,您的意图是,左侧的
    COUNT(COL2)
    应该用于
    COL1
    的不同值,但右侧的
    COUNT(COL2)
    应该覆盖
    COL1
    的所有值。因此,表达式作为一个整体是混合的,不是有效的SQL

  • 是的,如果你愿意,你可以这样想。首先运行最深的子查询,它向调用子查询返回一个结果集(在本例中,是一行一列)

  • 您可能会发现以下查询更有效,而不是对表有效地运行两个查询:

    where t1.col1 =
      (select col1
       from   (select col1, count_col2, MAX(count_col2) OVER () max_count_col2
               from   (select col1,
                              count(col2) AS count_col2
                       from t2
                       GROUP BY col1))
       where  count_col2 = max_count_col2)
    

    有趣的东西,我看一下,我以前没见过。至于效率,也许;我正在结束一门SQL101课程,并且正在编写一些相当具体的约束条件的代码。不管怎样,谢谢你花时间回答。