2017-10-05 1 views
1

J'ai cette partie d'une requête SQL Oracle (beaucoup plus au-dessus qui ne concerne pas la question) ...étrange oracle d'erreur d'identification non valide SQL

authorw as (
    select a.id, (sum(p.w)) "theWeightOfTheAuthor" 
    from ac a, pc p, authorpublication ap 
    where a.id = ap.aid and ap.pid = p.id 
    group by a.id) 

select authorCount.id "ID", auth.name "NAME", authorCount.c "TOTAL_NUMBER_OF_PUBS", 
    athw.theWeightOfTheAuthor "W_SCORE", 
    (authorCount.C/athw.theWeightOfTheAuthor) "MULT" 
from ac authorCount, authorw athw, Author auth 
where authorCount.id = athw.id and authorCount.id = auth.id 
order by TOTAL_NUMBER_OF_PUBS desc; 

où je reçois une erreur:

ORA-00904: "ATHW"."THEWEIGHTOFTHEAUTHOR": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 404 Column: 22 

ligne 404 étant le quatrième de la dernière ligne:

(authorCount.C/athw.theWeightOfTheAuthor) "MULT" 

REMARQUE: I peut accéder à athw.id très bien, et si j'exécute jusqu'à la création authorw, la table est imprimée correctement avec la colonne theWeightOfTheAuthor comme prévu. Ce qui donne?

+0

Parce que 'theWeightOfTheAuthor' est un nom différent, alors' 'theWeightOfTheAuthor ''. Voir le manuel pour plus de détails: https://docs.oracle.com/database/121/SQLRF/sql_elements008.htm#SQLRF00223 –

Répondre

2

Supprimez les guillemets autour de "theWeightOfTheAuthor" lorsque vous le définissez ou ajoutez des guillemets lorsque vous les utilisez. En citant le nom lors de la définition, le nom est sensible à la casse, et comme Oracle remplace tous les identificateurs non-quotés par UPPER CASE, votre référence au champ recherche réellement ATHW.THEWEIGHTOFTHEAUTHOR, qui n'existe pas.

Une règle de base de la programmation Oracle est - jamais d'identifiants de devis. C'est une douleur. Ne fais pas ça.

Bonne chance.

0

Vous avez spécifié l'alias de colonne entre guillemets, avec une casse mixte, comme "theWeightOfTheAuthor". Lorsque vous utilisez des guillemets doubles pour un nom de colonne, Oracle conserve la casse. Lorsque vous y faites référence sans les guillemets, athw.theWeightOfTheAuthor, Oracle le convertit automatiquement en majuscules. Donc, les deux ne correspondent pas.

Ma suggestion est de supprimer les guillemets de l'alias, il sera également interprété comme majuscules. Vous pouvez également utiliser des guillemets doubles pour toutes les références à cette colonne, mais je ne vois aucun avantage à utiliser des cas mixtes dans le nom de la colonne. (Vous pouvez toujours écrire comme casse, pour plus de lisibilité, mais Oracle le verra en majuscule.)