2

如果相关,我正在使用 SQL*Plus 或 Oracle 11g express。

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

这不起作用

where
t1.col1 =
    (select col1
    from t2
    having count(col2) = max(count(col2))
group by col1
;

有了以上内容,我收到:

ORA-00935: 组函数嵌套太深

这确实有效

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)如果只是为了清楚起见,我是否正确地假设更深的子查询首先“触发”,并为上子查询返回一个值,从而完全跳过混乱?

4

1 回答 1

2
  1. 编译器不会混淆。

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

    having count(col2) = max(count(col2)
    

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

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

  2. 是的,如果你愿意,你可以这样想。首先运行最深的子查询,它将结果集(在本例中为单行单列)返回给调用子查询。

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

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)
于 2012-12-10T07:34:36.360 回答