Oracle无效标识符(带内连接)

时间:2018-05-15 05:23:29

标签: oracle

我有一个"无效的标识符"在Oracle中因为" B.username" (USER表中存在用户名列)。当我删除它,它工作正常。如何解决这个问题?我来自MySQL背景。

SELECT * FROM (SELECT qNA.assignment, qNA.regDate, B.username, (
    SELECT DISTINCT NVL(idx, 0) 
    FROM EK_USERGRADE
    WHERE year = (SELECT DISTINCT userGradeNo FROM EK_USER WHERE ID = qNA.userIdx)
) AS userGradeIdx
FROM EK_NEWTESTAPPLICANT qNA
WHERE IDX = :idx ) A 
INNER JOIN EK_USER  B ON (A.userIdx = B.ID)

3 个答案:

答案 0 :(得分:2)

让我们用您的查询的简化版本来尝试:

-- test tables
create table NEWTESTAPPLICANT as select 1 useridx from dual  ;
create table B as select 1 id, 'name1' username from dual ;

-- query
select *
from (
  select B.username
  from NEWTESTAPPLICANT qNA
) A join B on A.useridx = B.id ;
-- ORA-00904: "B"."USERNAME": invalid identifier

NEWTESTAPPLICANT表中没有“用户名”列,导致错误。一个横向内联视图(例子见here)可以解决这个问题......

-- query
select 
  *
from B, lateral (
  select B.username
  from NEWTESTAPPLICANT qNA
) A ;

-- result
ID  USERNAME  USERNAME  
1   name1     name1  

这适用于Oracle 12c。

答案 1 :(得分:0)

问题是,您的虚拟表A和用户B都具有相同的列名“username”。在主选择中指定别名,例如“选择A. *,B。*来自(...”。

答案 2 :(得分:0)

是ORA-00903吗?

用户是保留字你确定你创建了这个表吗?表名不能是保留字。