В моем запросе есть огромный оператор CASE
, который отлично работает, кроме одной части.
Когда я добавляю предложение EXISTS
в одно из предложений WHEN
, я получаю ORA-00979: не оператор GROUP BY . Я не могу понять, почему, поскольку внутри 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)
)