Получение ORA-00979: не оператор GROUP BY без каких-либо агрегатных функций - PullRequest
0 голосов
/ 12 мая 2018

В моем запросе есть огромный оператор 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)
              )

1 Ответ

0 голосов
/ 13 мая 2018

Вы сказали, что у вас есть столбец F.STARTDATE в подвыборке, который является столбцом одной из целевых таблиц внешних FROM (включая любые JOIN ed таблицы). Ваш CASE находится во внешнем WHERE или в списке столбцов после внешнего SELECT.

В WHERE или списке столбцов после SELECT внешнего (или автономного) запроса вы не можете использовать ни один столбец, который не является частью GROUP BY или не передан функции агрегации (если тут есть GROUP BY конечно). Это также относится к использованию их в коррелированных подзапросах в этих вышеупомянутых местах. СУБД не может определить, какое значение выбрать из множества возможных.

...