ORACLE: ORA-00904: : 无效的标识符
Posted
技术标签:
【中文标题】ORACLE: ORA-00904: : 无效的标识符【英文标题】:ORACLE: ORA-00904: : invalid identifier 【发布时间】:2011-09-21 08:06:35 【问题描述】:我创建了以下选择:
select e.first_name, e.last_name,
(select jobname_id from
(select j.id, j.jobname_id, first_value(j.jobname_id)
over (order by j.date_from desc) as current_job
from jobs j where j.emp_id=e.emp_id and j.date_from < sysdate)
where jobname_id != current_job and rownum=1) as previous_job
from employees e
但我得到“ORA-00904:“E”。“EMP_ID”:无效标识符”
如何在子查询中使用对 E.EMP_ID 的引用?
【问题讨论】:
如果您在工作表中保存“date_to”列,您是否不能否定第一个子查询的需要。然后,您可以直接搜索上一个作业,因为它将是最近 date_to 条目小于 SYSDATE 的作业。 正确,但我必须确保所选值不是当前作业 ID。怎么样? 是的,但是如果 date_to 小于 SYSDATE 那么该作业不是“当前”,是吗? 不完全是,即使它是“上一个”记录,您也可以选择与当前相同的 jobname_id,而且我需要不同的上一个记录 - 这就是问题所在......如果我只能移动“哪里 j. emp_id=e.emp_id " 外 【参考方案1】:我不知道这个解决方案是否足够快满足您的需求,但它应该按计划工作。 另外,我同意 Ollie 关于附加字段“date_to”的看法。这会让事情变得更容易。
select
e.first_name as first_name,
e.last_name as last_name,
sub.jobname_id as jobname_id
from
employees e,
(
select
j.emp_id as emp_id,
j.jobname_id as jobname_id,
row_number()
over (
partition by j.emp_id
order by j.date_from desc
) as job_order
from
jobs j
where j.date_from < sysdate
) sub
where sub.emp_id = e.emp_id
and sub.job_order = 2
【讨论】:
【参考方案2】:您不能,但您可以将连接移出到外部子查询中。不过,不确定它是否适用于分析功能。
select e.first_name, e.last_name,
(select jobname_id from
(select j.emp_id, j.id, j.jobname_id, first_value(j.jobname_id)
over (order by j.date_from desc) as current_job
from jobs j where j.date_from < sysdate) j
where j.emp_id=e.emp_id and jobname_id != current_job and rownum=1) as previous_job
from employees e
【讨论】:
以上是关于ORACLE: ORA-00904: : 无效的标识符的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00904 无效标识符 -- 动态 Oracle 函数
ORA-00904: "CEILING": ORACLE 11G 中的标识符无效
python调用oracle函数ORA-00904无效标识符