【问题标题】:Oracle Invalid Identifier ErrorOracle 无效标识符错误
【发布时间】:2015-05-17 19:23:47
【问题描述】:

我知道以前有人问过这个问题,但我查看了其他问题,但我的查询仍然无效。我有一张包含过去 100 年左右的 MLB 击球统计数据的表格,我正在尝试查找球员 ID、本垒打以及该球员在该年(2012 年)本垒打总命中数中的百分比。

查询:

select playerid, hr, hr/sum(hr) over (partition by playerid, yearid)*100 p
from mlbbattingstats 
where yearid=2012 and p != 0
order by hr;

错误:

第 3 行出错:
ORA-00904: "P": 无效标识符

我尝试了多个不同的别名并得到相同的错误。如果之前已经回答了我做错的任何帮助,我们将不胜感激和抱歉。

【问题讨论】:

标签: sql oracle


【解决方案1】:

您不能在同一查询级别引用列别名(order by 除外)。您需要将语句包装到派生表中:

select *
from (
  select playerid, hr, hr/sum(hr) over (partition by playerid, yearid)*100 p
  from mlbbattingstats 
  where yearid = 2012 
) 
where p <> 0
order by hr;

【讨论】:

  • 谢谢,这是有道理的,但现在我在第 6 行收到错误错误:ORA-00904: "YEARID": invalid identifier
  • @user3587186:啊对。复制粘贴出错,抱歉。您可以将yearid = 2012 移动到派生表中(我所做的)或将yearid 添加到选择列表中,并在外部查询中将两个 where 条件保持在一起(性能方面,对于这个简单的查询并不重要)
【解决方案2】:

如果p &lt;&gt; 0,那么hr &lt;&gt; 0。因此,您的查询似乎等同于:

select playerid, hr,
       hr/sum(hr) over (partition by playerid, yearid)*100 as p
from mlbbattingstats 
where yearid = 2012 and hr <> 0
order by hr;

您最初的问题是您不能将where 子句中select 中定义的列别名用作同一级别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多