Oracleで「ORA-00918: 列の定義が不明瞭です 」のエラーの解決法と発生理由

投稿日:

発生したエラー

ORA-00918: 列の定義が不明瞭です

原因

原因は、同じ列名やテーブルの別名を使用していること。

解決方法

  1. Select句で羅列している列に同一の列名(別テーブル)があれば、as句を使って別名を定義
  2. Select句でas句で重複している列名があれば、修正
  3. From句でJOINしているテーブルの別名が重複していれば、修正

多分、この順番で見ていけば解決できる。

エラーが発生した理由

通常、デザイナとかクエリウィザードみたいなのを使ってSQLを作成する場合は、発生しないエラーかと。
重複する列名などは自動で数字を付与したりして、ダブらないようにしてくれてますし。

普段は、デザイナ経由でSQLを作成している自分がなぜこのエラーにぶち当たったのかというと、既存SQLの修正でした。

バージョン管理が影響していた

弊社では、SVNを使用したソースのバージョン管理をしています。
これがトリガーでした・・・

  • Ver1:自分が修正を行ったもの
  • Ver2:Ver1の修正を反映させたもの

エラーが発生したのは、Ver2でした。
Ver2にSQLなどを移植し、実行確認の際に「ORA-00918: 列の定義が不明瞭です 」のエラーが発生しました。

当然ながら、Ver1に対してテストを行い、エラーが発生しない状態まで保障しています。
その後、Ver2に修正を反映させるわけですが、反映させたSQL部分に別の人の修正が先に適用されていました。

不幸にも別の修正で自分が追加したテーブルが被る結果に・・・
社内ルールのせいで、使用する別名も同一。

で、エラーになりましたとさw

 
早い者勝ちかよ・・・







-ORACLE, 開発メモ
-

関連記事

コマンドプロンプトのFor文で、ファイルの一覧を表示する。

コマンドプロンプトの出力結果を引数として、別のコマンドを実行させる。 なんてことが出来ることは知ってるんだけど、どうやってやるのかは良く分からない。 おもむろにコマンドプロンプトを立ち上げて、以下のコ …

ORACLEでDELETEとTRUNCATEのどちらを使うか。

未だに迷う。 例えば、テーブル全件削除をしたいときは delete * from tableA; delete文なら、こうだし。 truncate tableA; truncate文なら、こう。

Oracleで複数レコードを更新する方法

UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。 基本的に、今まで使ってきたUPDATE文では、 UPDATE tableA set COL1 = 1 ,COL …

ORACLEのMERGE INTOで、UPDATEは出来るのに、INSERTできない

最近、Oracleのエラーの話しか書いてない気がするw     便利というか、トランザクション内の処理も1つで済むので、MERGE INTO文を使うことがあります。 実際、 新規デ …

[C#]systemcolorを使う

ボタンとかを作成した時に、BackColorとかにデフォルトで設定される色を変更したいけど、何かのアクション以外は、デフォルト職を使いたい。 って時に多分使える。 SystemColorsクラス(Mi …


カテゴリー