2011-09-14 236 views
6

誰も私がcms.CRIME_ID上のエラーを取得する理由を私は把握に役立ちます。奇妙なOracleのSQL「無効な識別子」エラー

invalid identifier

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; 

私は列が存在することを絶対的な事実を知っていると私は他のすべてのを参照することができますそのテーブルの列はそれ以外のものです。

この列の唯一の違いは、それがそのテーブルの主キーであることです。

EDIT:これは完全なエラーとテーブル作成スクリプトです。

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; 
+0

ユーザーが犯罪のテーブルの上にパーミッションを持っています –

+1

関連するテーブルの詳細を投稿してください? –

+0

crime_chargesテーブルの定義は何ですか? – Ollie

答えて

0

次は試しましたか?

代わりにキーワードの
Join On (Left Id) = (Right Id) 

Using

+0

はい、残念ながらそれは役に立たなかった。 – JohnQPublic

+0

Join()とJoin On()=()は同じです。 – Thinhbk

0

文をJOIN句のエイリアスを作ってみる:あなたはclause.you「を使用して」で参照される列に修飾子を使用することはできません

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

は、内部使用することができます参加代わりに このクエリを使用してみてください:

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

ここでの問題は、クエリにUSING句がある場合、この句で使用される列に修飾子を追加できないことです。クエリにUSING (crime_id),があるため、cms.CRIME_IDcc.crime_idも記述できません。代わりに修飾子を削除する必要があります。つまり、crime_idを使用してください。奇妙なことに

、私はOracleの11グラムのXEのベータ版でこれをしようとしたとき、私は別のエラーが出る:

 
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