得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句
Posted
技术标签:
【中文标题】得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句【英文标题】:Getting ORA-00979: not a GROUP BY statement without any aggregate functions 【发布时间】:2018-05-12 20:27:27 【问题描述】:我的查询中有一个巨大的CASE
语句,除了一部分之外它工作正常。
当我在 WHEN
子句之一中添加 EXISTS
子句时,我得到 ORA-00979: not a GROUP BY statement。我不知道为什么,因为SELECT
中没有聚合函数。如果我评论整个EXISTS
部分或其中的所有LEFT JOIN
s(以及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 放入答案中。
【参考方案1】:
您说,您在子选择中有一个列F.STARTDATE
,它是外部FROM
(包括任何JOIN
ed 表)的目标表之一的列。您的CASE
位于外部WHERE
或外部SELECT
之后的列列表中。
在WHERE
或外部(或独立)查询的SELECT
之后的列列表中,您不能使用任何列,该列既不是GROUP BY
的一部分,也不是传递给聚合函数(如果当然有GROUP BY
)。这也适用于在上述这些地方的相关子查询中使用它们。 DBMS 也无法确定从那里可能有很多值中选择哪个值。
【讨论】:
好吧,我认为起初CASE
是为每一行计算的,然后才对值进行分组。至少这是有道理的。以上是关于得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句的主要内容,如果未能解决你的问题,请参考以下文章