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を気づかずに使っていると、意図しない結果が返ってくる可能性があるため注意が必要です。