Weird Oracle SQL "Invalid Identifier" error

18,113

Solution 1

The problem here is that when your query has a USING clause, you can't add qualifiers to the column(s) used within this clause. Because your query has USING (crime_id), you can't write cms.CRIME_ID nor cc.crime_id. Instead, you must remove the qualifier, i.e., just use crime_id.

Oddly enough, when I try this on Oracle 11g XE beta, I get a different error:

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

Solution 2

you cannot use qualifier with column referenced by "using" clause.you could use inner join instead of that try using this query:

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;
Share:
18,113

Related videos on Youtube

JohnQPublic
Author by

JohnQPublic

Updated on June 04, 2022

Comments

  • JohnQPublic
    JohnQPublic almost 2 years

    Can anyone help me figure out why I get an error on cms.CRIME_ID:

    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;
    

    I know for an absolute fact that column exists and I can reference every other column in that table except for that.

    The only thing different about that column is that it is the primary key for that table.

    EDIT: Here is the error in full and the table creation script.

    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: Also, I should probably mention that when not using joins and just regular select statements I can access the column just fine, as in the following code example:

    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;
    
    • p.campbell
      p.campbell over 12 years
      Does your user have permission on the crimes table?
  • JohnQPublic
    JohnQPublic over 12 years
    Yes, unfortunately that did not help.
  • Thinhbk
    Thinhbk over 12 years
    Join Using () vs Join On () = () is the same.