奇怪的 Oracle SQL“无效标识符”错误

Posted

技术标签:

【中文标题】奇怪的 Oracle SQL“无效标识符”错误【英文标题】:Weird Oracle SQL "Invalid Identifier" error 【发布时间】:2011-09-14 02:26:15 【问题描述】:

谁能帮我弄清楚为什么我在cms.CRIME_ID 上收到错误:

标识符无效

select c.criminal_id, c.first, c.last, cms.CRIME_ID, cc.crime_code, cc.fine_amount
from criminals c join crimes cms on c.criminal_id = cms.criminal_id
join crime_charges cc using (crime_id)
order by c.first, c.last;

我绝对知道该列存在,除此之外,我可以引用该表中的所有其他列。

该列唯一不同的是它是该表的主键。

编辑:这是完整的错误和表创建脚本。

Error starting at line 1 in command:
select c.criminal_id, c.first, c.last, cms.CRIME_ID, cc.crime_code, cc.fine_amount
from criminals c join crimes cms on c.criminal_id = cms.criminal_id
join crime_charges cc using (crime_id)
order by c.first, c.last
Error at Command Line:1 Column:39
Error report:
SQL Error: ORA-00904: "CMS"."CRIME_ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

 CREATE TABLE crimes
      (crime_id NUMBER(9),
       criminal_id NUMBER(6),
       classification CHAR(1),
       date_charged DATE,
       status CHAR(2),
       hearing_date DATE,
       appeal_cut_date DATE);

ALTER TABLE crimes
  MODIFY (classification DEFAULT 'U');
ALTER TABLE crimes
  ADD (date_recorded DATE DEFAULT SYSDATE);
ALTER TABLE crimes
  MODIFY (criminal_id NOT NULL);
ALTER TABLE crimes
  ADD CONSTRAINT crimes_id_pk PRIMARY KEY (crime_id);
ALTER TABLE crimes
  ADD CONSTRAINT crimes_class_ck CHECK (classification IN('F','M','O','U'));
ALTER TABLE crimes
  ADD CONSTRAINT crimes_status_ck CHECK (status IN('CL','CA','IA'));
ALTER TABLE crimes
  ADD CONSTRAINT crimes_criminalid_fk FOREIGN KEY (criminal_id)
             REFERENCES criminals(criminal_id);
ALTER TABLE crimes
  MODIFY (criminal_id NOT NULL);

EDIT2:另外,我应该提一下,当不使用连接而只使用常规选择语句时,我可以很好地访问该列,如下面的代码示例所示:

select c.criminal_id, c.first, c.last, cms.crime_id, cc.crime_code, cc.fine_amount
from criminals c, crime_charges cc, crimes cms
where c.criminal_id = cms.criminal_id
and cms.crime_id = cc.crime_id
order by c.first, c.last;

【问题讨论】:

请贴出涉及表的详细信息 您的用户是否拥有犯罪表的权限? crime_charges 表的定义是什么? F,M,O,U = 重罪、轻罪、条例 (?)、??? 您是否尝试过使用完全限定名称(例如:crimes.crime_id 而不是cms.crime_id)? 【参考方案1】:

这里的问题是,当您的查询有USING 子句时,您不能在该子句中使用的列中添加限定符。因为您的查询有USING (crime_id),,所以您不能写cms.CRIME_ID 也不能写cc.crime_id。相反,您必须删除限定符,即只使用 crime_id

奇怪的是,当我在 Oracle 11g XE beta 上尝试这个时,我得到一个不同的错误:

SQL> 从 test1 中选择 *; 甲乙 ---------- ---------- 1 2 SQL> 从 test2 中选择 *; 交流电 ---------- ---------- 1 3 SQL> select t1.a, t1.b, t2.c from test1 t1 inner join test2 t2 using (a); 使用 (a) 从 test1 t1 内部连接 ​​test2 t2 中选择 t1.a, t1.b, t2.c * 第 1 行的错误: ORA-25154: USING 子句的列部分不能有限定符 SQL> select a, t1.b, t2.c from test1 t1 inner join test2 t2 using (a); 甲乙丙 ---------- ---------- ---------- 1 2 3

【讨论】:

【参考方案2】:

您不能将限定符与“using”子句引用的列一起使用。您可以使用内连接代替 尝试使用此查询:

select c.criminal_id, c.first, c.last, cms.CRIME_ID, cc.crime_code, cc.fine_amount
from criminals c join crimes cms on c.criminal_id = cms.criminal_id
join crime_charges cc on cc.crime_id=cms.crime_id
order by c.first, c.last;

【讨论】:

【参考方案3】:

尝试为连接语句子句创建别名:

select alias.criminal_id, alias.first, alias.last, alias.CRIME_ID, alias.crime_code, alias.fine_amount
from criminals c join crimes cms on c.criminal_id = cms.criminal_id
join crime_charges cc using (crime_id) as alias
order by alias.first, alias.last;

【讨论】:

【参考方案4】:

您是否尝试过以下操作?

Join On (Left Id) = (Right Id)

代替关键字Using

【讨论】:

是的,很遗憾这没有帮助。 Join Using () vs Join On () = () 是一样的。

以上是关于奇怪的 Oracle SQL“无效标识符”错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle,无效标识符错误

错误报告:SQL 错误:ORA-00904::无效标识符 00904。00000 - “%s:无效标识符”

为啥我不断收到这个受诅咒的 SQL*Plus 无效标识符错误?

谁能告诉我为啥会收到 SQL*PLUS 无效标识符错误?

Oracle 存储过程问题 - IN 和 OUT 变量是无效标识符 [关闭]

Oracle SQL 创建视图无效标识符