我有一部分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
列。是什么给了什么?
答案 0 :(得分:2)
在定义"theWeightOfTheAuthor"
时删除引号,或在使用时添加引号。在定义名称时引用名称会使名称区分大小写,并且由于Oracle将所有未引用的标识符更改为UPPER CASE,因此您对该字段的引用实际上是在寻找不存在的ATHW.THEWEIGHTOFTHEAUTHOR。
Oracle编程的基本规则是 - 从不引用标识符。这是一种痛苦。不要这样做。
祝你好运。
答案 1 :(得分:0)
您已使用双引号将列别名指定为"theWeightOfTheAuthor"
,并使用大小写混合大小写。当您使用双引号作为列名时,Oracle会保留大小写。当您引用它而没有引号时,如athw.theWeightOfTheAuthor
,Oracle会自动将其转换为大写。所以这两个人不匹配。
我的建议是从别名中删除双引号,因此它也会被解释为大写。或者,您可以对此列的所有引用使用双引号,但我没有看到在列名中使用混合大小写的任何好处。 (为了便于阅读,你仍然可以写它作为大小写混合,但Oracle会将其视为大写。)