6

でエラーが発生する理由を理解するのを手伝ってくれる人はいますか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

4 に答える 4

3

ここでの問題は、クエリにUSING句がある場合、この句内で使用される列に修飾子を追加できないことです。あなたのクエリには Nor をUSING (crime_id),書くことができないためcms.CRIME_IDですcc.crime_id。代わりに、修飾子を削除する必要があります。つまり、単にcrime_id.

奇妙なことに、これを Oracle 11g XE ベータ版で試すと、別のエラーが発生します。

SQL> select * from test1;

         AB
---------- ----------
         1 2

SQL> select * from 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);

         ABC
---------- ---------- ----------
         1 2 3
于 2011-09-18T07:44:57.337 に答える
1

「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;
于 2011-09-18T06:49:27.333 に答える
0

次のことを試しましたか?

Join On (Left Id) = (Right Id)

キーワードの代わりにUsing

于 2011-09-14T02:57:52.497 に答える
0

結合ステートメント句のエイリアスを作成してみてください。

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;
于 2011-09-14T04:20:24.327 に答える