[英]Weird Oracle SQL “Invalid Identifier” error
任何人都可以幫我弄清楚為什么我在cms.CRIME_ID
上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語句時,我可以正常訪問該列,如下面的代碼示例所示:
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;
這里的問題是,當您的查詢具有USING
子句時,您不能將限定符添加到此子句中使用的列。 因為您的查詢具有USING (crime_id),
您不能編寫cms.CRIME_ID
或cc.crime_id
。 相反,您必須刪除限定符,即只使用crime_id
。
奇怪的是,當我在Oracle 11g XE beta上嘗試這個時,我得到了一個不同的錯誤:
SQL> select * from test1; A B ---------- ---------- 1 2 SQL> select * from test2; A C ---------- ---------- 1 3 SQL> select t1.a, t1.b, t2.c from test1 t1 inner join test2 t2 using (a); select t1.a, t1.b, t2.c from test1 t1 inner join test2 t2 using (a) * ERROR at line 1: ORA-25154: column part of USING clause cannot have qualifier SQL> select a, t1.b, t2.c from test1 t1 inner join test2 t2 using (a); A B C ---------- ---------- ---------- 1 2 3
你不能使用限定符與“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;
你試過以下嗎?
Join On (Left Id) = (Right Id)
而不是關鍵字Using
嘗試為join語句子句創建別名:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.