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无效标识符

ORACLE ORA-00904: 无效标识符错误

PL/SQL JAVA ORACLE 错误 ORA-00904: 标识符无效

Oracle 11g ORA-00904 中的抽象数据类型:标识符无效