0
votes

Impossible de corriger l'erreur Oracle Ora-00905 Mott clé manquant dans SQL

Je crée ce petit extrait de code simple pendant une journée et je ne trouve pas le problème provoquant l'erreur. Comme le titre indique, je reçois une erreur ora-00905 Mot-clé manquant code> Lorsque vous essayez d'exécuter le code suivant:

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 commentaires

Vous n'avez rarement jamais besoin de sélectionner distinct lorsque le groupe par.


Ajoutez quelques données de table d'échantillons et le résultat attendu - tout comme texte formaté, pas d'images. Jetez un coup d'œil à Stackoverflow.com/help/mcve en premier.


Votre expression de cas est inutile: Case lorsque vmp.reserve_dt est NULL, NULL SINDE SINDE VMP.RESERER_DT END est identique au vmp.reserve_dt .


3 Réponses :


2
votes

ici: xxx pré>

le fin code> est après une comparaison et que le boîtier n'est pas comparé contre une valeur. P>

commutateur : P>

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


2 commentaires

Qui peut être simplifié à où tronc (vmp.est_pickup_dt) = trunc (sysdate)


@A_HORSE_WITH_NO_NAME correct, j'étais occupé à vérifier la syntaxe et non la sémantique.



3
votes

Essayez de remplacer ceci: xxx

avec: xxx

Veuillez noter que toute cette expression (et d'autres personnes similaires dans la requête) pourrait être simplifié comme: xxx

lorsque vmp.est_pickup_dt est null , trunc Retournera null , qui ne sera pas égal à trunc (sysdate) .


1 commentaires

@Ezlo Votre réponse était au cou et au cou avec GMB, mais son a montré d'abord alors je lui ai donné la résolution. Vos réponses ont été fonctionnellement identiques, donc j'ai donné à la fois des upvotes. Merci à vous deux pour la réponse rapide.



1
votes

ne peut pas trouver le problème provoquant l'erreur p>

Bien que je suppose que @ezlo et @a_horse_with_no_name a peut-être trouvé une erreur dans ce cas, je peux proposer une procédure forte> strie> dans le débogage de ces requêtes. P>

Étape 1: Déboguer votre Join- et où- prédicats h1>

Commenter tout dans votre relevé sélectionné, laissez uniquement des jointures, des champs de substitution avec * code> ou une expression constante. P>

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


1 commentaires

J'utilise un processus similaire et il y avait d'autres erreurs résolues avant de poster. J'ai regardé à droite à la déclaration de fin de cause et je n'ai pas vu le problème. Merci pour la suggestion!