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_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

原文由 Navaneethan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 784
2 个回答

你的问题是那些有害的双引号。

 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>

Oracle SQL 允许我们忽略数据库对象名称的大小写,只要我们使用全部大写的名称创建它们,或者不使用双引号。如果我们在脚本中使用混合大小写或小写字母,并将标识符用双引号括起来,我们就注定要在引用对象或其属性时使用双引号和精确大小写:

 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;博士

不要在 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'

原文由 APC 发布,翻译遵循 CC BY-SA 4.0 许可协议

就我而言,当我尝试在 Oracle 中创建一个像这样的新表时,在最后一行使用 , 时出现此错误

create table products(
  id_pro number primary key,
  product_name varchar2(20),
);

通过删除 , 问题解决如下

create table products_test(
  id_pro number primary key,
  product_name varchar2(20)
);

原文由 hakima maarouf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进