【发布时间】: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 放入答案中。