95

Oracleデータベースを使用して次の内部結合クエリを作成しようとしました。

 SELECT Employee.EMPLID as EmpID, 
        Employee.FIRST_NAME AS Name,
        Team.DEPARTMENT_CODE AS TeamID, 
        Team.Department_Name AS teamname
 FROM PS_TBL_EMPLOYEE_DETAILS Employee
 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team 
 ON Team.DEPARTMENT_CODE = Employee.DEPTID

それは以下のエラーを与えます:

 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID
                                              *
ERROR at line 4:
ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier

1つのテーブルのDDLは次のとおりです。

CREATE TABLE "HRMS"."PS_TBL_DEPARTMENT_DETAILS"
(
  "Company Code" VARCHAR2(255),
  "Company Name" VARCHAR2(255),
  "Sector_Code" VARCHAR2(255),
  "Sector_Name" VARCHAR2(255),
  "Business_Unit_Code" VARCHAR2(255),
  "Business_Unit_Name" VARCHAR2(255),
  "Department_Code" VARCHAR2(255),
  "Department_Name" VARCHAR2(255),
  "HR_ORG_ID" VARCHAR2(255),
  "HR_ORG_Name" VARCHAR2(255),
  "Cost_Center_Number" VARCHAR2(255),
  " " VARCHAR2(255)
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS
4

12 に答える 12

140

あなたの問題はそれらの有害な二重引用符です。

SQL> CREATE TABLE "APC"."PS_TBL_DEPARTMENT_DETAILS"
  2  (
  3    "Company Code" VARCHAR2(255),
  4    "Company Name" VARCHAR2(255),
  5    "Sector_Code" VARCHAR2(255),
  6    "Sector_Name" VARCHAR2(255),
  7    "Business_Unit_Code" VARCHAR2(255),
  8    "Business_Unit_Name" VARCHAR2(255),
  9    "Department_Code" VARCHAR2(255),
 10    "Department_Name" VARCHAR2(255),
 11    "HR_ORG_ID" VARCHAR2(255),
 12    "HR_ORG_Name" VARCHAR2(255),
 13    "Cost_Center_Number" VARCHAR2(255),
 14    " " VARCHAR2(255)
 15  )
 16  /

Table created.

SQL>

Oracle SQLでは、すべて大文字の名前で作成するか、二重引用符を使用せずにデータベースオブジェクト名を作成する場合、データベースオブジェクト名の大文字と小文字を無視できます。スクリプトで大文字と小文字の混合または小文字を使用し、識別子を二重引用符で囲んだ場合、オブジェクトまたはその属性を参照するときは常に、二重引用符と正確な大文字小文字を使用する必要があります。

SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where Department_Code = 'BAH'
  3  /
where Department_Code = 'BAH'
      *
ERROR at line 2:
ORA-00904: "DEPARTMENT_CODE": invalid identifier


SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where "Department_Code" = 'BAH'
  3  /

  COUNT(*)
----------
         0

SQL>

tl; dr

DDLスクリプトで二重引用符を使用しないでください

(私はほとんどのサードパーティのコードジェネレーターがそうすることを知っていますが、それらはすべてのオブジェクト名を大文字にするのに十分な規律があります。)


逆もまた真です。二重引用符を使用せずにテーブルを作成すると…</p>

create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
  company_name VARCHAR2(255),
  Cost_Center_Number VARCHAR2(255))
;

…どのような場合でも、それとその列を参照できます。

select * from ps_tbl_department_details

… また

select * from PS_TBL_DEPARTMENT_DETAILS;

… また

select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'
于 2011-05-17T11:59:18.397 に答える
13

私の場合、このエラーは、テーブルに列名が存在しないために発生しました。

""を実行describe tablenameすると、マッピングhbmファイルで指定された列が見つかりませんでした。

テーブルを変更した後、それはうまくいきました。

于 2014-05-06T16:32:06.933 に答える
5

参考までに、この場合、原因はテーブル作成用のDDLの大文字と小文字が混在する列名であることが判明しました。

ただし、「古いスタイル」とANSI結合を混在させている場合は、大文字のテーブル名を使用してDDLが適切に実行された場合でも、同じエラーメッセージが表示される可能性があります。これは私に起こりました、そしてグーグルは私をこのstackoverflowページに送ったので、私はここにいたので私が共有したいと思いました。

--NO PROBLEM: ANSI syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
INNER JOIN PS_NAME_PWD_VW B ON B.EMPLID = A.EMPLID
INNER JOIN PS_HCR_PERSON_NM_I C ON C.EMPLID = A.EMPLID
WHERE 
    LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/

--NO PROBLEM: OLD STYLE/deprecated/traditional oracle proprietary join syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
, PS_NAME_PWD_VW B 
, PS_HCR_PERSON_NM_I C 
WHERE 
    B.EMPLID = A.EMPLID
    and C.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/

上記の2つのSQLステートメントは同等であり、エラーは発生しません。

それらを混ぜ合わせようとすると、幸運になるか、OracleにORA-00904エラーが発生する可能性があります。

--LUCKY: mixed syntax (ANSI joins appear before OLD STYLE)
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
    , PS_NAME_PWD_VW B
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/

--PROBLEM: mixed syntax (OLD STYLE joins appear before ANSI)
--http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    , PS_NAME_PWD_VW B
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/

そして、実際には問題をまったく説明していない役に立たないエラーメッセージ:

>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier  Script line 6, statement line 6,
column 51 

私は次のブログ投稿でこれに関するいくつかの研究を見つけることができました:

私の場合、古いスタイルからANSIスタイルの結合に手動で変換しようとしており、一度に1つのテーブルで段階的に変換していました。これは悪い考えだったようです。代わりに、すべてのテーブルを一度に変換するか、作成している新しいANSIクエリと比較するために、元のクエリのテーブルとそのwhere条件をコメントアウトすることをお勧めします。

于 2013-10-08T02:12:53.087 に答える
4

DEPARTMENT_CODEは、テーブルTeamに存在する列ではありません。テーブルのDDLをチェックして、適切な列名を見つけてください。

于 2011-05-17T08:24:38.403 に答える
2

テーブルPS_TBL_DEPARTMENT_DETAILSに列DEPARTEMENT_CODEがありますか?

エラーに関する詳細情報

ORA-00904:string:無効な識別子です原因:入力された列名が欠落しているか無効です。処置:有効な列名を入力してください。有効な列名は、文字で始まり、30文字以下で、英数字と特殊文字$、_、および#のみで構成されている必要があります。他の文字が含まれている場合は、d個の二重引用符で囲む必要があります。予約語ではないかもしれません。

于 2011-05-17T08:16:39.120 に答える
2

JPAを介してエンティティを保存しようとしたときに、このエラーが発生しました。

@JoinColumn注釈のない列に注釈があるため@ManyToOneです。

追加@ManyToOneすると問題が修正されました。

于 2019-03-12T17:54:27.643 に答える
0

Eclipseリンクを使用したJPA2でも同じ例外がありました。エンティティと1対1の関係を持つ@embeddedクラスがありました。誤って、埋め込みクラスに@Table( "TRADER")というアノテーションもありました。DBがエンティティからJPAによって作成されたとき、テーブルTRADERも作成され(Traderエンティティがメインエンティティに埋め込まれているため、これは間違っていました)、そのテーブルの存在により、試行するたびに上記の例外が発生していました。私のエンティティを永続化します。TRADERテーブルを削除した後、例外は発生しませんでした。

于 2013-01-24T10:45:39.020 に答える
0

また、クエリを発行するユーザーに必要な権限が付与されていることを確認してください。

テーブルに対するクエリの場合、SELECT権限を付与する必要があります。
他のオブジェクトタイプ(ストアドプロシージャなど)に対するクエリの場合は、EXECUTE権限を付与する必要があります。

于 2016-07-14T09:45:41.520 に答える
0

引用符なしで値を渡していました。一重引用符内の条件を通過すると、魅力のように機能しました。

Select * from emp_table where emp_id=123;

上記の代わりにこれを使用してください:

Select * from emp_table where emp_id='123';
于 2016-10-24T09:05:17.480 に答える
0

同じ例外があり、私の場合の問題は、サブクエリに列が存在しなかったことが原因でした。「欠落している」列/識別子が、参照しているエイリアスを持つテーブルに属していることがわかっているにもかかわらずです。

例-このクエリはORA-00904-列に無効な識別子を生成しますMC.SIT_TYPE

SELECT MC.ID_CODE,
       MC.EMP_NAME
FROM (SELECT MC.ID_CODE, 
             MC.EMP_NAME
      FROM EMP_WORKER MC) MC
INNER JOIN TEM_SHEETS FR ON MC.SIT_TYPE = FR.ID_CODE -- This line has the ORA-00904 error.
LEFT JOIN WRK_TYPE RAS ON MC.ID_CODE = RAS.ID_CODE;

MC.SIT_TYPEここで、サブクエリを変更した後(列を追加して)、ORA-00904消えます。

結果:

SELECT MC.ID_CODE,
       MC.EMP_NAME
FROM (SELECT MC.ID_CODE, 
             MC.EMP_NAME, ​
            ​ -- Here, the "missing invalid identifier, in this case (MC.SIT_TYPE)" is added: 
             MC.SIT_TYPE
      FROM EMP_WORKER MC) MC
INNER JOIN TEM_SHEETS FR ON MC.SIT_TYPE = FR.ID_CODE 
LEFT JOIN WRK_TYPE RAS ON MC.ID_CODE = RAS.ID_CODE;

ここにいくつかのヒントがあります:

  • コードの表/インデントを非常に注意深く確認してください-(設定に応じて)、SQLDeveloperはコードのインデントを異なる方法で処理します。
  • 作業中のコードは表形式/インデントされていない可能性があります。このようなエラーのデバッグは困難で時間がかかります。
  • 列/サブクエリのエイリアス(コード一般)を変更して、一意のエイリアスを生成します。つまり、サブクエリと関連テーブルに同じエイリアスを使用しないでください。
于 2021-04-22T15:06:12.217 に答える
0

見逃して使用しなかったテーブルエイリアスがあったため、エラーメッセージが表示されました。

これにより、「cl」エイリアスが原因でエラーがスローされます。

SELECT * FROM MYSCHEMA.COMPANYLOCATION_CL cl JOIN MYSCHEMA.COMPANYTYPE_CT ON MYSCHEMA.COMPANYLOCATION_CL.CLNR = MYSCHEMA.COMPANYTYPE_CT.CT_CL_NR 

'cl'がないと、正常に機能します。

SELECT * FROM MYSCHEMA.COMPANYLOCATION_CL JOIN MYSCHEMA.COMPANYTYPE_CT ON MYSCHEMA.COMPANYLOCATION_CL.CLNR = MYSCHEMA.COMPANYTYPE_CT.CT_CL_NR 

テーブル名について文句を言わないでください-スキーマは20年前のものです...

于 2021-08-09T15:30:28.477 に答える
0

私の場合、エラーの原因は列名に間違った大文字と小文字を使用したことであり、同じ問題が発生しているようです。

Department_CodeDEPARTMENT_CODEOracleの場合と同じではありません。

于 2021-11-18T07:25:39.403 に答える