Странная ошибка Oracle SQL "Неверный идентификатор" - PullRequest
6 голосов
/ 14 сентября 2011

Может кто-нибудь помочь мне выяснить, почему я получаю сообщение об ошибке 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;

Ответы [ 4 ]

3 голосов
/ 18 сентября 2011

Проблема здесь в том, что когда в вашем запросе есть предложение USING, вы не можете добавить квалификаторы в столбцы, используемые в этом предложении. Поскольку у вашего запроса USING (crime_id),, вы не можете написать cms.CRIME_ID или cc.crime_id. Вместо этого вы должны удалить квалификатор, то есть просто использовать crime_id.

Как ни странно, когда я пробую это на бета-версии Oracle 11g 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
1 голос
/ 18 сентября 2011

Вы не можете использовать квалификатор со столбцом, на который ссылается условие "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;
0 голосов
/ 14 сентября 2011

попробуйте создать псевдоним для оператора операторов объединения:

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;
0 голосов
/ 14 сентября 2011

Вы пробовали следующее?

Join On (Left Id) = (Right Id)

Вместо ключевого слова Using

...