【问题标题】:In GROUP BY, can we reference a parent query's column?在 GROUP BY 中,我们可以引用父查询的列吗?
【发布时间】:2012-01-04 04:10:33
【问题描述】:

如果是,下面的第一个查询应该是正确的,但显示错误 ORA-00979: not a GROUP BY 表达式。 如果不是,第三个查询也应该抛出错误...

 SELECT   POSSIBLE.ENAME, POSSIBLE.DEPTNO, POSSIBLE.SAL
 FROM     EMP POSSIBLE
 WHERE    SAL >
   (SELECT   AVG (SAL)
    FROM     EMP AVERAGE group by possible.deptno having
        POSSIBLE.DEPTNO = AVERAGE.DEPTNO) ;

 SELECT   POSSIBLE.ENAME, POSSIBLE.DEPTno, POSSIBLE.SAL
 FROM     EMP POSSIBLE
 WHERE    SAL >
   (SELECT   AVG (SAL)
    FROM     EMP AVERAGE group by average.deptno having
        POSSIBLE.DEPTno = AVERAGE.DEPTno) ;

 SELECT   POSSIBLE.ENAME, POSSIBLE.DEPTNO, POSSIBLE.SAL
 FROM     EMP POSSIBLE
 WHERE    SAL >
   (SELECT   AVG (SAL)
    FROM     EMP AVERAGE group by possible.deptno) ;

【问题讨论】:

  • 再一次,似乎第一个查询是错误的,要么是因为'group by' 要么是'have'......无论哪种方式,无论出于何种原因,接下来的两个形式也应该是错误的。提供意见...?

标签: sql group-by correlated-subquery


【解决方案1】:

您的第一个查询应该使用WHERE,而不是HAVINGHAVING 子句用于根据聚合(即非分组)值进行过滤,而不是过滤分组中涉及的行。

除此之外,您甚至不需要在第一个查询中进行分组。

SELECT   POSSIBLE.ENAME, POSSIBLE.DEPTNO, POSSIBLE.SAL
 FROM     EMP POSSIBLE
 WHERE    SAL >
   (SELECT   AVG (SAL)
    FROM     EMP AVERAGE WHERE
        POSSIBLE.DEPTNO = AVERAGE.DEPTNO) ;

【讨论】:

  • 第二个查询显示没有错误,尽管 'HAVING'。上面提到的所有正确查询都显示相同的正确输出
  • @popstack:那是因为您在分组表达式上使用了HAVINGHAVING 中允许的规则与SELECT 中允许的规则相同)。在第一个查询中,您按possible.deptno 分组,这就是average.deptno 不允许在HAVING 子句中的原因(它们是否相同并不重要;表达式本身不在@ 987654331@ 子句)。
  • 这就是我问的...为什么第二个查询是正确的?它按 'average.deptno' ... 和 ... 分组 POSSIBLE.DEPTno = AVERAGE.DEPTno) ;为什么这里没有错误???
  • @popstack:因为该查询中HAVING 中的唯一表达式要么是分组的(average.deptno),要么来自外部查询。在第一个查询中,HAVING 中有 average.deptno,但它没有分组。
  • 另外,请记住,一旦回答了您的问题,您需要接受答案。您之前的任何问题都没有这样做,因此请花点时间访问它们并标记对您最有帮助的答案。
【解决方案2】:
SELECT   POSSIBLE.ENAME, POSSIBLE.DEPTNO, POSSIBLE.SAL  FROM     EMP POSSIBLE  WHERE    SAL >    (SELECT   AVG (SAL)
    FROM     EMP AVERAGE group by possible.deptno having
        POSSIBLE.DEPTNO = AVERAGE.DEPTNO) ;

我认为错误 ORA-00979: not a GROUP BY 是在内部查询的 having 子句中引用 AVERAGE.DEPTNO

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2020-08-10
    • 2013-03-05
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多