我try 使用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

推荐答案

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

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;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'

Sql相关问答推荐

SQL -连接两个表的次数与第一个表中匹配的次数相同

如何返回字符串中包含相同值的数据?

SQL计数所有值在联接范围内的行

如何更改函数返回的列名?

解析键-值对,根据值 Select ,并使用SQL创建新列

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

删除事务中的本地临时表

如何在SQL中更新Json字符串

正在try 从SQL获取最新的ID和一个唯一名称

在SQL GROUP BY中的某些行之后执行计算

从选定记录中提取摘要作为值的划分

在 postgres 中插入或更新 jsonb 数组的对象

确定小数中使用的精度位数

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

SQL 多个不满足的条件失败

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

使用给定的变量对在循环中执行更新语句

使用其他表 SUM 的交换价格转换价格并获得 AVG

使用SQL中另一个表的查询结果在表中查找记录

Athena:从字符串birth_dt列计算年龄