奇怪的无效标识符错误oracle SQL

时间:2017-10-05 02:48:12

标签: sql oracle oracle-sqldeveloper

我有一部分Oracle 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;

我收到错误的地方:

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

第404行是最后一行的第四行:

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

注意:我可以正常访问athw.id,如果我执行authorw创建,则表格会按预期正确打印出theWeightOfTheAuthor列。是什么给了什么?

2 个答案:

答案 0 :(得分:2)

在定义"theWeightOfTheAuthor"时删除引号,或在使用时添加引号。在定义名称时引用名称会使名称区分大小写,并且由于Oracle将所有未引用的标识符更改为UPPER CASE,因此您对该字段的引用实际上是在寻找不存在的ATHW.THEWEIGHTOFTHEAUTHOR。

Oracle编程的基本规则是 - 从不引用标识符。这是一种痛苦。不要这样做。

祝你好运。

答案 1 :(得分:0)

您已使用双引号将列别名指定为"theWeightOfTheAuthor",并使用大小写混合大小写。当您使用双引号作为列名时,Oracle会保留大小写。当您引用它而没有引号时,如athw.theWeightOfTheAuthor,Oracle会自动将其转换为大写。所以这两个人不匹配。

我的建议是从别名中删除双引号,因此它也会被解释为大写。或者,您可以对此列的所有引用使用双引号,但我没有看到在列名中使用混合大小写的任何好处。 (为了便于阅读,你仍然可以它作为大小写混合,但Oracle会将其视为大写。)