【问题标题】:Getting ORA-00979: not a GROUP BY statement without any aggregate functions得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句
【发布时间】:2018-05-12 20:27:27
【问题描述】:

我的查询中有一个巨大的CASE 语句,除了一部分之外它工作正常。

当我在 WHEN 子句之一中添加 EXISTS 子句时,我得到 ORA-00979: not a GROUP BY statement。我不知道为什么,因为SELECT 中没有聚合函数。如果我评论整个EXISTS 部分或其中的所有LEFT JOINs(以及WHERE 中的最后两个条件),查询工作正常,所以我认为问题出在连接上。

我很确定我使用了所有需要的列进行连接,但即使我没有,多个返回行应该如何影响EXISTS 的结果?据我所知,它只是检查是否返回了 0 行或更多行。

虽然查询中有GROUP BY 语句,但我只是将整个CASE 复制到那里,如果我注释掉EXISTS 子句,它就可以工作。

我不能发布整个代码,因为它有 500 行,希望这就足够了:

WHEN NVL(BH_LAST_WEEK.QTY,0) < NVL(BH_PREV_WEEK.QTY,0)
 AND F.TOTFCST > F.TOTHIST
 AND EXISTS (SELECT 1
             FROM SCPOMGR.DFUVIEW DV_INNER
             INNER JOIN SCPOMGR.ITEM I_INNER
                     ON I_INNER.ITEM = DV_INNER.DMDUNIT
             LEFT JOIN BASEHIST BH_LAST_WEEK_INNER
                    ON BH_LAST_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND BH_LAST_WEEK_INNER.LOC = DV_INNER.LOC
                   AND BH_LAST_WEEK_INNER.STARTDATE = F.STARTDATE
             LEFT JOIN BASEHIST BH_PREV_WEEK_INNER
                    ON BH_PREV_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND BH_PREV_WEEK_INNER.LOC = DV_INNER.LOC
                   AND BH_PREV_WEEK_INNER.STARTDATE = F.STARTDATE - 7
             LEFT JOIN (SELECT *
                        FROM EFF_PRICES 
                        WHERE STARTDATE = F.STARTDATE) EP_LAST_WEEK_INNER
                    ON EP_LAST_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND EP_LAST_WEEK_INNER.LOC = DV_INNER.LOC
             LEFT JOIN EFF_PRICES EP_PREV_WEEK_INNER
                    ON EP_PREV_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND EP_PREV_WEEK_INNER.LOC = DV_INNER.LOC
                   AND EP_PREV_WEEK_INNER.STARTDATE = F.STARTDATE - 7
             WHERE I_INNER.U_HL4_CODE = I.U_HL4_CODE
               AND DV_INNER.LOC = F.LOC
               AND DV_INNER.DMDGROUP = 'RETAIL'
               AND DV_INNER.U_LEVEL = '000'
               AND EP_LAST_WEEK_INNER.EFFPRICE / EP_PREV_WEEK_INNER.EFFPRICE < 0.75
               AND BH_LAST_WEEK_INNER.QTY > BH_PREV_WEEK_INNER.QTY * (1 + 0.6 * F.TOTHIST / F.TOTFCST)
              )

【问题讨论】:

  • 是否有可能在子选择中的外部目标表中有一列不在外部查询的GROUP BY 中?
  • 嗯,是的,例如F.STARTDATE - 7 不在外部GROUP BY 中。但它不在输出中,所以我认为这不会导致麻烦......
  • 但是您的情况是在外部WHERE 或在外部查询的选定列列表中,不是吗?您不能在那里使用外部查询的任何列,它既不是GROUP BY 的一部分,也不是传递给聚合函数的。这也适用于在那个地方的相关子查询中使用它们,DBMS 也无法确定要从那里的许多值中选择哪个值。
  • @stickybit 。 . .您应该将您的 cmets 放入答案中。

标签: sql oracle case exists


【解决方案1】:

您说,您在子选择中有一个列F.STARTDATE,它是外部FROM(包括任何JOINed 表)的目标表之一的列。您的CASE 位于外部WHERE 或外部SELECT 之后的列列表中。

WHERE 或外部(或独立)查询的SELECT 之后的列列表中,您不能使用任何列,该列既不是GROUP BY 的一部分,也不是传递给聚合函数(如果当然有GROUP BY)。这也适用于在上述这些地方的相关子查询中使用它们。 DBMS 也无法确定从那里可能有很多值中选择哪个值。

【讨论】:

  • 好吧,我认为起初 CASE 是为每一行计算的,然后才对值进行分组。至少这是有道理的。
猜你喜欢
  • 2017-06-20
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2015-08-20
  • 2010-11-15
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多