Oracle Database を使用して SQL を実行した際に
「ORA-00918 : 列の定義が未確定です。」
というエラーが発生することがあります。
このエラーは、SQL 文の記述自体に問題があるケースがほとんどで、原因を正しく理解すれば比較的シンプルに解決できます。本記事では、ORA-00918 エラーが発生する代表的な原因と、具体的な修正方法について解説します。

ORA-00918 エラーとは
ORA-00918 は、SQL 文の中で「どの列を指しているのか Oracle が判断できない」場合に発生するエラーです。
特に、複数のテーブルを結合する SQL で発生しやすく、列名の指定方法が不十分なことが主な原因です。
主な原因① 同じ列名が複数のテーブルに存在している
最も多い原因は、複数テーブルを結合した際に、同じ名前の列が複数存在しているケースです。
発生しやすい例
|
1 2 3 |
SELECT ID, NAME FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID; |
EMP テーブルと DEPT テーブルの両方に ID 列や NAME 列が存在している場合、
どのテーブルの列を取得するのか Oracle が判断できず、ORA-00918 が発生します。
修正方法
テーブル名または別名を付けて、列を明示的に指定します。
|
1 2 3 |
SELECT EMP.ID, EMP.NAME FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID; |
または、テーブルに別名を付ける方法も一般的です。
|
1 2 3 |
SELECT E.ID, E.NAME FROM EMP E JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID; |
主な原因② SELECT 句で別名が重複している
SELECT 句で列別名を指定している場合、同じ別名を複数の列に設定するとエラーになることがあります。
発生しやすい例
|
1 2 3 4 |
SELECT EMP.ID AS ID, DEPT.ID AS ID FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID; |
この場合、結果セット上で ID 列が重複するため、ORA-00918 が発生します。
修正方法
列別名が重複しないように修正します。
|
1 2 3 4 |
SELECT EMP.ID AS EMP_ID, DEPT.ID AS DEPT_ID FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID; |
主な原因③ サブクエリ内の列名が曖昧になっている
サブクエリを使用した SQL でも、列の定義が曖昧になることがあります。
発生しやすい例
|
1 2 3 4 5 6 |
SELECT ID FROM ( SELECT ID FROM EMP UNION SELECT ID FROM DEPT ); |
この例では問題ありませんが、JOIN や追加条件が入ると列の特定ができずエラーになることがあります。
修正方法
サブクエリに別名を付け、外側で参照する列を明示します。
|
1 2 3 4 5 6 |
SELECT T.ID FROM ( SELECT ID FROM EMP UNION SELECT ID FROM DEPT ) T; |
主な原因④ ORDER BY 句で曖昧な列を指定している
SELECT 句では問題がなくても、ORDER BY 句で列名のみを指定するとエラーになることがあります。
発生しやすい例
|
1 2 3 4 |
SELECT EMP.ID, DEPT.ID FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID ORDER BY ID; |
修正方法
ORDER BY でもテーブル名や別名を付けて指定します。
|
1 |
ORDER BY EMP.ID; |
または SELECT 句で定義した別名を使用します。
|
1 2 3 4 |
SELECT EMP.ID AS EMP_ID, DEPT.ID AS DEPT_ID FROM EMP JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID ORDER BY EMP_ID; |
まとめ
ORA-00918 エラーは、SQL 文中の列指定が曖昧な場合に発生します。
特に以下の点を意識すると、エラーを防ぐことができます。
・複数テーブルを使用する場合は、列名の前にテーブル名または別名を付ける
・列別名が重複しないようにする
・ORDER BY 句でも列を明示的に指定する
SQL の可読性向上にもつながるため、普段から明示的な列指定を心がけることをおすすめします。
