仕事で起きたエラー(ORA-00904)

仕事で一瞬はまってしまったSQLのエラーについて備忘として記載

EJB, JBossなど利用している金融件案件でデータ移行後の稼働確認を行っていたのですが以下エラーが発生

 

エラー

ORA-00904 無効な識別子です。

識別子 "Aテーブル"."Aカラム"は存在しません。

 

上記エラーは超単純で、対象テーブルまたは対象カラムが接続先DBに存在しないときに発生するものです。このエラーが発生していた機能はSELECTによるデータ抽出処理なのですが、SQL文は設定ファイルに定義されており構文は以下のような感じ

 

SQL

SELECT 

 カラム名

FROM

 Aテーブル AS Aテーブル名

LEFT OUTER JOIN Bテーブル

ON Aテーブル.Aカラム名 = Bテーブル.Bカラム名

 

上記だと特段問題ないように思えたのですが、プログラム経由で実行すると識別子エラーが出まくる。

考えられたのは以下3件

 

①接続先DBが違う

②テーブルが古い

SQL実際には更新されている

 

①はもっと別のエラーが出るはずで違う、、、

②はテーブル構成を確認してもキーなので存在する。

となると③だな、と思いデバッグで発行しているSQLを改めて確認することに

 

デバッグで最終的に発行するSQLを取得して、再度SQLを実行すると識別子エラーが発生。よし、やはりSQLに問題がある。ということで中身を確認すると以下の通りとなっていることが判明。

 

■実際に発行されているSQL

SELECT 

 カラム名

FROM

 Aテーブル AS Aテーブル名

 , Cテーブル

LEFT OUTER JOIN Bテーブル

ON Aテーブル.Aカラム名 = Bテーブル.Bカラム名

 

一瞬、「特に問題なくね?」と思ってしまったのですがこれはダメなんです。

(私は分からなくて教えてもらいましたが。。。)

 

原因

 

注目すべきは下線部です。

JOINの構文ですが、結合したいテーブルの直後にJOIN句を記載する必要があります。

今回のようなLEFT OUTER JOINの場合、Aテーブルの直後にJOINが来るならば問題ないのですがAテーブルの直後にCテーブルが増えているため、Cテーブルに対してJOINを行おうとしてエラーが発生しました。

 

FROM

 Aテーブル AS Aテーブル名

 , Cテーブル                 //FROMにCテーブルが追加

LEFT OUTER JOIN Bテーブル           //Cテーブルに結合する(JOIN)

ON Aテーブル.Aカラム名 = Bテーブル.Bカラム名 //BテーブルとAテーブルを結合するが、CテーブルにはAテーブルがないのでエラー

 

対応

じゃあどうするのか?ですが簡単で、以下の通りCテーブルとAテーブルの順番を入れ替えれば解消できます。

 

FROM

 Cテーブル           

 , Aテーブル AS Aテーブル名      

LEFT OUTER JOIN Bテーブル           

ON Aテーブル.Aカラム名 = Bテーブル.Bカラム名 

 

 

ぱっと見で分からなかったのが悔しい