仕事で起きたエラー(ORA-00904)
仕事で一瞬はまってしまったSQLのエラーについて備忘として記載
EJB, JBossなど利用している金融件案件でデータ移行後の稼働確認を行っていたのですが以下エラーが発生
エラー
ORA-00904 無効な識別子です。
識別子 "Aテーブル"."Aカラム"は存在しません。
上記エラーは超単純で、対象テーブルまたは対象カラムが接続先DBに存在しないときに発生するものです。このエラーが発生していた機能はSELECTによるデータ抽出処理なのですが、SQL文は設定ファイルに定義されており構文は以下のような感じ
■SQL文
SELECT
FROM
Aテーブル AS Aテーブル名
LEFT OUTER JOIN Bテーブル
上記だと特段問題ないように思えたのですが、プログラム経由で実行すると識別子エラーが出まくる。
考えられたのは以下3件
①接続先DBが違う
②テーブルが古い
③SQL実際には更新されている
①はもっと別のエラーが出るはずで違う、、、
②はテーブル構成を確認してもキーなので存在する。
となると③だな、と思いデバッグで発行しているSQLを改めて確認することに
デバッグで最終的に発行するSQLを取得して、再度SQLを実行すると識別子エラーが発生。よし、やはりSQLに問題がある。ということで中身を確認すると以下の通りとなっていることが判明。
■実際に発行されているSQL文
SELECT
FROM
Aテーブル AS Aテーブル名
, Cテーブル
LEFT OUTER JOIN 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テーブル
ぱっと見で分からなかったのが悔しい