Sql ORA-00904:无效标识符

Sql ORA-00904:无效标识符,sql,database,oracle,ora-00904,Sql,Database,Oracle,Ora 00904,我尝试使用Oracle数据库编写以下内部联接查询: SELECT Employee.EMPLID as EmpID, Employee.FIRST_NAME AS Name, Team.DEPARTMENT_CODE AS TeamID, Team.Department_Name AS teamname FROM PS_TBL_EMPLOYEE_DETAILS Employee INNER JOIN PS_TBL_DEPARTMENT_D

我尝试使用Oracle数据库编写以下内部联接查询:

 SELECT Employee.EMPLID as EmpID, 
        Employee.FIRST_NAME AS Name,
        Team.DEPARTMENT_CODE AS TeamID, 
        Team.Department_Name AS teamname
 FROM PS_TBL_EMPLOYEE_DETAILS Employee
 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team 
 ON Team.DEPARTMENT_CODE = Employee.DEPTID
这会产生以下错误:

 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID
                                              *
ERROR at line 4:
ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier
一个表的DDL为:

CREATE TABLE "HRMS"."PS_TBL_DEPARTMENT_DETAILS"
(
  "Company Code" VARCHAR2(255),
  "Company Name" VARCHAR2(255),
  "Sector_Code" VARCHAR2(255),
  "Sector_Name" VARCHAR2(255),
  "Business_Unit_Code" VARCHAR2(255),
  "Business_Unit_Name" VARCHAR2(255),
  "Department_Code" VARCHAR2(255),
  "Department_Name" VARCHAR2(255),
  "HR_ORG_ID" VARCHAR2(255),
  "HR_ORG_Name" VARCHAR2(255),
  "Cost_Center_Number" VARCHAR2(255),
  " " VARCHAR2(255)
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS

您确定表中有部门代码列吗

关于你的错误

ORA-00904:字符串:无效标识符 原因:输入的列名缺失或无效。 操作:输入有效的列名。有效的列名必须以 信, 少于或等于30个字符,且仅由 字母数字字符和 特殊字符$、和。 如果它包含其他字符,则必须用d double括起来 引号。 它可能不是保留字


部门代码不是表团队中存在的列。检查表的DDL以找到正确的列名。

您的问题是那些有害的双引号

SQL> CREATE TABLE "APC"."PS_TBL_DEPARTMENT_DETAILS"
  2  (
  3    "Company Code" VARCHAR2(255),
  4    "Company Name" VARCHAR2(255),
  5    "Sector_Code" VARCHAR2(255),
  6    "Sector_Name" VARCHAR2(255),
  7    "Business_Unit_Code" VARCHAR2(255),
  8    "Business_Unit_Name" VARCHAR2(255),
  9    "Department_Code" VARCHAR2(255),
 10    "Department_Name" VARCHAR2(255),
 11    "HR_ORG_ID" VARCHAR2(255),
 12    "HR_ORG_Name" VARCHAR2(255),
 13    "Cost_Center_Number" VARCHAR2(255),
 14    " " VARCHAR2(255)
 15  )
 16  /

Table created.

SQL>
oraclesql允许我们忽略数据库对象名称的大小写,只要我们创建它们时名称都是大写的,或者不使用双引号。如果我们在脚本中使用大小写混合或小写,并将标识符用双引号括起来,那么每当我们引用对象或其属性时,我们就会使用双引号和精确的大小写:

SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where Department_Code = 'BAH'
  3  /
where Department_Code = 'BAH'
      *
ERROR at line 2:
ORA-00904: "DEPARTMENT_CODE": invalid identifier


SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where "Department_Code" = 'BAH'
  3  /

  COUNT(*)
----------
         0

SQL>

tl;dr

不要在DDL脚本中使用双引号

(我知道大多数第三方代码生成器都是这样做的,但它们非常严格,可以将所有对象名都用大写字母表示。)


反之亦然。如果我们不使用双引号创建表

create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
  company_name VARCHAR2(255),
  Cost_Center_Number VARCHAR2(255))
;
…我们可以在任何情况下引用它及其列:

select * from ps_tbl_department_details
…或

select * from PS_TBL_DEPARTMENT_DETAILS;
select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'
…或

select * from PS_TBL_DEPARTMENT_DETAILS;
select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'

我在JPA2中使用eclipse链接时也遇到了同样的异常。我有一个@embedded类,它与一个实体有一对一的关系。 由于错误,在嵌入式类中,我还有注释@Table(“TRADER”)。当JPA从实体中创建DB时,它还创建了一个表交易员(这是错误的,因为交易员实体嵌入到主实体中),并且该表的存在每次我试图持久化我的实体时都会导致上述异常。
删除TRADER表后,异常消失。

FYI,在这种情况下,发现原因是用于创建表的DDL中的混合案例列名

但是,如果混合使用“旧式”和ANSI联接,即使DDL使用大写表名正确完成,也可能会收到相同的错误消息。这件事发生在我身上,谷歌把我发送到这个stackoverflow页面,所以我想我会在这里分享

--NO PROBLEM: ANSI syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
INNER JOIN PS_NAME_PWD_VW B ON B.EMPLID = A.EMPLID
INNER JOIN PS_HCR_PERSON_NM_I C ON C.EMPLID = A.EMPLID
WHERE 
    LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/

--NO PROBLEM: OLD STYLE/deprecated/traditional oracle proprietary join syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
, PS_NAME_PWD_VW B 
, PS_HCR_PERSON_NM_I C 
WHERE 
    B.EMPLID = A.EMPLID
    and C.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/
上面的两个SQL语句是等效的,不会产生错误

当你尝试混合它们时,你会很幸运,或者你会发现Oracle有ORA-00904错误

--LUCKY: mixed syntax (ANSI joins appear before OLD STYLE)
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
    , PS_NAME_PWD_VW B
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/

--PROBLEM: mixed syntax (OLD STYLE joins appear before ANSI)
--http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    , PS_NAME_PWD_VW B
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/
还有一条毫无帮助的错误消息,它根本没有真正描述问题:

>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier  Script line 6, statement line 6,
column 51 
我在下面的博文中找到了一些关于这方面的研究:


在我的例子中,我试图手动将旧样式的联接转换为ANSI样式的联接,并以增量方式一次转换一个表。这似乎是个坏主意。相反,最好一次转换所有表,或者注释掉原始查询中的表及其where条件,以便与您正在编写的新ANSI查询进行比较。

在我的例子中,由于表中不存在列名,因此发生了此错误

执行“
descripe tablename
”时,无法找到映射hbm文件中指定的列


更改表后,它工作正常。

还要确保发出查询的用户已被授予必要的权限

对于表上的查询,您需要授予SELECT权限。

对于其他对象类型(例如存储过程)的查询,您需要授予EXECUTE权限。

我传递的值没有引号。一旦我通过了单引号中的条件,它就发挥了巨大的作用

Select * from emp_table where emp_id=123;
使用以下选项代替上述选项:

Select * from emp_table where emp_id='123';

我在试图通过JPA保存实体时出现了这个错误

这是因为我有一个带有
@JoinColumn
注释的专栏,但没有
@manytone
注释


添加
@ManyToOne
修复了这个问题。

我也遇到了同样的异常,我的问题是子查询中不存在列-尽管我知道“缺少”列/标识符属于别名为我所指的表

示例-此查询在列
MC.SIT\u TYPE
处生成ORA-00904-无效标识符:

现在,在修改子查询(通过添加
MC.SIT\u TYPE
列)之后,
ORA-00904
将消失

结果:

SELECT MC.ID_CODE,
       MC.EMP_NAME
FROM (SELECT MC.ID_CODE, 
             MC.EMP_NAME, ​
            ​ -- Here, the "missing invalid identifier, in this case (MC.SIT_TYPE)" is added: 
             MC.SIT_TYPE
      FROM EMP_WORKER MC) MC
INNER JOIN TEM_SHEETS FR ON MC.SIT_TYPE = FR.ID_CODE 
LEFT JOIN WRK_TYPE RAS ON MC.ID_CODE = RAS.ID_CODE;
以下是一些提示:

  • 仔细检查代码的制表/缩进(取决于您的设置),SQLDeveloper会以不同的方式处理代码的缩进
  • 您正在处理的代码可能没有列表/缩进,这使得调试此类错误更加困难和耗时
  • 修改列/子查询的别名(代码通常用于生成唯一别名),我的意思是:不要对子查询和相关表使用相同的别名

您确定列名Department\u Code拼写正确吗?是的,有一个列Department\u Code;DR:使用单引号
。表格i中有列已检查。您能给我们表格PS_TBL_部门_详情的DDL吗?创建表格“HRMS”。“PS_TBL_部门_详情”(“公司代码”VARCHAR2(255)、“公司名称”VARCHAR2(255)、“部门_代码”VARCHAR2(255)、“部门名称”VARCHAR2(255),“业务单位代码”VARCHAR2(255)、“业务单位名称”VARCHAR2(255)、“部门代码”VARCHAR2(255),