10

Oracle 10g (XE 10.2.0.1.0) を使用していますが、理解できない動作を見つけました。

select * 
from employees manager
    join employees worker on MANAGER.EMPLOYEE_ID = WORKER.MANAGER_ID
    join departments on DEPARTMENTS.manager_id = 108
where
    department_id = 100
;

問題は、オラクルが where 句のあいまいさについて文句を言うべきだと思うことです。これは、テーブルとdepartment_idの両方の列であるためです。事実は Oracle 10g にありますが、そうではありません。結果は、 を にあるものとして解釈することを示しています。ただし、2 番目の結合ステートメント (上記の 4 行目) をコメントアウトすると、Oracle は予想どおり「ORA-00918: 列があいまいに定義されています」と文句を言います。employeesdepartmentsdepartment_iddepartments

では、あいまいさが Oracle 10g でどのように定義されているかを説明してくれる人はいますか? それとも、これは 10g のバグですか?

ところで: テーブルは、Oracle 10g にバンドルされているデフォルトの HR スキーマで定義されています。

更新: 関連する投稿が見つかりました: Oracle SQL は、ある結合ではあいまいさを神秘的に解決し、他の結合では解決しないのはなぜですか

4

2 に答える 2

10

Oracle が修正しないことを選択したのは、Oracle 10g のバグだと思います。アプリケーションを 10g から 11gR2 にアップグレードしていたとき、あいまいな列名に関して「おおざっぱに」書かれたクエリがいくつか見つかりましたが、Oracle 10g では機能しました。それらはすべて11gR2で機能しなくなりました。Oracle に問い合わせたところ、あいまいな列名に対する寛容な動作は Oracle 10g の正しい動作であり、厳密な動作は 11g の正しい動作であるとほとんど言われました。

于 2011-06-09T14:44:06.247 に答える
1

部門がないので、そうだと思いますalias。したがって、によって修飾されていないものはすべて、<alias>.最初にからのものとして扱われますdepartments

したがってdepartments、エイリアスを指定するときに、ORA-00918を再度取得する必要があると思います。ここではテストできません...

于 2011-06-09T13:36:26.997 に答える