Невозможно исправить ошибку Oracle ORA-00905 Отсутствует ключевое слово в SQL - PullRequest
0 голосов
/ 08 января 2019

В течение дня я работал над этим небольшим фрагментом простого кода и не могу найти проблему, вызывающую ошибку. Как говорится в заголовке, я получаю ошибку ORA-00905 Missing Keyword при попытке выполнить следующий код:

SELECT DISTINCT DM.DESCRIPTION                 AS "AGENCY",
                DM.DEPT_NO                     AS "DEPT NO",
                CASE
                    WHEN VMP.RESERVE_DT IS NULL THEN
                        NULL
                    ELSE
                        VMP.RESERVE_DT
                END AS "RESV_DT",
                CASE
                    WHEN VMP.EST_PICKUP_DT IS NULL THEN
                        NULL
                    ELSE
                        VMP.EST_PICKUP_DT
                END AS "EST_PKUP_DT",
                CASE
                    WHEN VMP.EST_RETURN_DT IS NULL THEN
                        NULL
                    ELSE
                        VMP.EST_RETURN_DT
                END AS "EST_RETN_DT",
                VMP.EMP_NAME                   AS "EMPL_NAME",
                VMP.UNIT_NO                    AS "UNIT_NUMBER",
                VMP.RENTAL_CLASS_DESCRIPTION   AS "RENT_CLS",
                VMP.MP_TICKET_NO               AS "MP_TKT_NO"
  FROM DEPT_MAIN DM
 INNER JOIN VIEW_MPOOL VMP ON VMP.DEPT_ID = DM.DEPT_ID
 WHERE CASE
           WHEN VMP.EST_PICKUP_DT IS NULL THEN
               NULL
           ELSE
               TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE)
       END
 GROUP BY DM.DESCRIPTION,
          DM.DEPT_NO,
          CASE
              WHEN VMP.RESERVE_DT IS NULL THEN
                  NULL
              ELSE
                  VMP.RESERVE_DT
          END,
          CASE
              WHEN VMP.EST_PICKUP_DT IS NULL THEN
                  NULL
              ELSE
                  VMP.EST_PICKUP_DT
          END,
          CASE
              WHEN VMP.EST_RETURN_DT IS NULL THEN
                  NULL
              ELSE
                  VMP.EST_RETURN_DT
          END,
          VMP.EMP_NAME,
          VMP.UNIT_NO,
          VMP.RENTAL_CLASS_DESCRIPTION,
          VMP.MP_TICKET_NO
 ORDER BY CASE
    WHEN VMP.EST_PICKUP_DT IS NULL THEN
        NULL
    ELSE
        VMP.EST_PICKUP_DT
END ASC

Основа этого кода была создана с помощью специальной программы отчетности и изначально была полностью квалифицирована. Я убрал лишние кавычки и назначил псевдонимы таблиц, чтобы очистить его. Хотя я надеялся, что эти усилия помогут мне найти проблему, я не могу найти причину. Спасибо за ваше внимание.

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Попробуйте заменить это:

WHERE 
    CASE 
        WHEN VMP.EST_PICKUP_DT IS NULL THEN NULL 
        ELSE TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE) 
    END

С:

WHERE 
    CASE 
        WHEN VMP.EST_PICKUP_DT IS NULL THEN NULL 
        ELSE TRUNC(VMP.EST_PICKUP_DT) 
    END 
    = TRUNC(SYSDATE)

Обратите внимание, что все это выражение (и другие подобные в запросе) можно упростить как:

WHERE
    TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE)

Когда VMP.EST_PICKUP_DT равно NULL, TRUNC вернет NULL, что не будет равно TRUNC(SYSDATE).

0 голосов
/ 08 января 2019

не может найти проблему, вызывающую ошибку

Хотя я предполагаю, что @EzLo и @a_horse_with_no_name, возможно, уже нашли ошибку в этом случае, я могу предложить общую процедуру при отладке таких запросов.

Шаг 1. Отладка предикатов JOIN- и WHERE-

Комментируйте все в своем операторе SELECT, оставляйте только JOIN, заменяйте поля * или константным выражением.

* 1014 Е.Г. *

SELECT 1 
    -- DISTINCT DM.DESCRIPTION                 AS "AGENCY",
    --             DM.DEPT_NO                     AS "DEPT NO",
    --             CASE
    -- ....
    --             VMP.RENTAL_CLASS_DESCRIPTION   AS "RENT_CLS",
    --             VMP.MP_TICKET_NO               AS "MP_TKT_NO"
FROM DEPT_MAIN DM
INNER JOIN VIEW_MPOOL VMP ON VMP.DEPT_ID = DM.DEPT_ID
WHERE CASE
        WHEN VMP.EST_PICKUP_DT IS NULL THEN
            NULL
        ELSE
            TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE)
    END
--  GROUP BY DM.DESCRIPTION,
--  ....
--  ORDER BY ..

В случае нескольких сложных предикатов - раскомментируйте один предикат за раз.

Шаг 2. Отладка ваших GROUP BY и HAVING

Раскомментируйте раздел GROUP BY и отредактируйте раздел полей вашего запроса. Если у вас сложный групповой режим - раскомментируйте по одному полю за раз. Начните с самого простого до сложного

SELECT
        DM.DESCRIPTION
        ,DM.DEPT_NO    
    -- ...
FROM DEPT_MAIN DM
INNER JOIN VIEW_MPOOL VMP ON VMP.DEPT_ID = DM.DEPT_ID
WHERE CASE
        WHEN VMP.EST_PICKUP_DT IS NULL THEN
            NULL
        ELSE
            TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE)
    END
GROUP BY DM.DESCRIPTION
        ,DM.DEPT_NO

Скопируйте и вставьте свои GROUP BYs в раздел SELECT.

Шаг 3. Отладка агрегатов, преобразование полей и переименования

Теперь у вас есть правильный SELECT-запрос, но, вероятно, не в нужной форме.

Шаг 4: Отладка ORSER BYS

У вас правильная форма, и на последнем этапе вам нужно ЗАКАЗАТЬ ПО ВАШИМ ДАННЫМ.

Если у вас есть приличный редактор / IDE, вы можете найти источник ошибки за 5-10 минут даже в случае сложных запросов (и даже с ошибками движка СУБД)

приписка

Лучше заметить, какую версию СУБД вы используете.

0 голосов
/ 08 января 2019

Здесь:

WHERE 
    CASE 
        WHEN VMP.EST_PICKUP_DT IS NULL 
        THEN NULL 
        ELSE TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE) 
    END

END - после сравнения, и случай не сравнивается со значением.

Переключить как:

WHERE 
    CASE 
        WHEN VMP.EST_PICKUP_DT IS NULL 
        THEN NULL 
        ELSE TRUNC(VMP.EST_PICKUP_DT)
    END = TRUNC(SYSDATE) 

Что, как говорит лошадь, можно просто упростить до

WHERE TRUNC(VMP.EST_PICKUP_DT) = TRUNC(SYSDATE)

, поскольку значение NULL на VMP.EST_PICKUP_DT никогда не будет совпадать с TRUNC(SYSDATE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...