[Oracle] 「ORA-00918: 列の定義が未確定です。」になるはずが... | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

このSQLはどこがおかしいでしょう?

SELECT
  E1.ENAME NAME,
  E1.SAL SAL,
  E2.ENAME MANAGER,
  E2.SAL MANAGER_SAL
  FROM EMP E1
  LEFT OUTER JOIN EMP E2
    ON E1.MGR = E2.EMPNO
      AND SAL >= 3000;

このSQLは、EMP表を自己結合(左外部結合)して、従業員とそのマネージャの名前と給与を取得するものなのですが、最後の行の"SAL"にエイリアスが指定されていないので、"E1"の"SAL"なのか"E2"の"SAL"なのかがわかりません。

9.2.0.7.0環境では、このようなSQLを実行すると

ORA-00918: 列の定義が未確定です。

というエラーが発生します。

しかし、どういうわけか9.2.0.1.0環境ではこれが通ってしまうのです。

SQL> SELECT E1.ENAME NAME, E1.SAL SAL, E2.ENAME MANAGER, E2.SAL MANAGER_SAL
  2    FROM EMP E1
  3    LEFT OUTER JOIN EMP E2 ON E1.MGR = E2.EMPNO AND SAL >= 3000
  4  /

NAME                   SAL MANAGER         MANAGER_SAL
--------------- ---------- --------------- -----------
ADAMS                 1100 SCOTT                  3000
CLARK                 2450 KING                   5000
BLAKE                 2850 KING                   5000
JONES                 2975 KING                   5000
SMITH                  800 FORD                   3000
KING                  5000
MILLER                1300
JAMES                  950
TURNER                1500
MARTIN                1250
WARD                  1250
ALLEN                 1600
FORD                  3000
SCOTT                 3000

14行が選択されました。

しかも、それらしき結果も返ってきます。

この結果を見る限りは"E2.SAL >= 3000"と解釈されているようです。

ちなみにこれが内部結合(INNER JOIN)ならちゃんとエラーが発生します。

SQL> SELECT E1.ENAME NAME, E1.SAL SAL, E2.ENAME MANAGER, E2.SAL MANAGER_SAL
  2    FROM EMP E1
  3    INNER JOIN EMP E2 ON E1.MGR = E2.EMPNO AND SAL >= 3000
  4  /
  INNER JOIN EMP E2 ON E1.MGR = E2.EMPNO AND SAL >= 3000
                                             *
行3でエラーが発生しました。:
ORA-00918: 列の定義が未確定です。


どうもこれはバグだったようで、9.2.0.6.0で改修されたようです。


9.2.0.5.0以前でこのようなSQLを気づかずに使っていると、意図しない結果が返ってくる可能性があるため注意が必要です。