Странная ошибка Oracle SQL "Неверный идентификатор"
Может кто-нибудь помочь мне выяснить, почему я получаю сообщение об ошибке 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);
РЕДАКТИРОВАТЬ 2: Кроме того, я должен вероятно упомянуть, что, когда не используются соединения и только обычные операторы выбора, я могу получить доступ к столбцу очень хорошо, как в следующем примере кода:
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 ответа
Проблема здесь в том, что когда ваш запрос имеет USING
предложение, вы не можете добавить квалификаторы в столбцы, используемые в этом предложении. Потому что ваш запрос имеет USING (crime_id),
ты не можешь писать cms.CRIME_ID
ни cc.crime_id
, Вместо этого вы должны удалить классификатор, т.е. просто использовать crime_id
,
Как ни странно, когда я пробую это на бета-версии Oracle 11g XE, я получаю другую ошибку:
SQL> select * from test1; AB ---------- ---------- 1 2 SQL> выбрать * из test2; переменный ток ---------- ---------- 1 3 SQL> выберите t1.a, t1.b, t2.c из test1 t1 внутреннего соединения test2 t2 используя (a); выберите t1.a, t1.b, t2.c из test1 t1 внутреннего соединения test2 t2 с помощью (a) * ОШИБКА в строке 1: ORA-25154: часть столбца предложения USING не может иметь квалификатор SQL> выберите a, t1.b, t2.c из test1 t1 внутреннего соединения test2 t2 используя (a); азбука ---------- ---------- ---------- 1 2 3
Вы не можете использовать квалификатор со столбцом, на который ссылается "using" clause. Вы можете использовать внутреннее соединение вместо того, чтобы попытаться использовать этот запрос:
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;
Попробуйте создать псевдоним для оператора операторов объединения:
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;
Вы пробовали следующее?
Join On (Left Id) = (Right Id)
Вместо ключевого слова Using