Почему Oracle 10g не жалуется на двусмысленность столбца?
Я использую 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
;
Проблема заключается в том, что Oracle должен жаловаться на двусмысленность department_id
в предложении where, так как это столбец в таблице employees
и departments
. Дело в Oracle 10g, это не так, и результат показывает, что он интерпретирует department_id
как тот, что находится в departments
. Однако, если я прокомментирую второй оператор объединения (4-я строка выше), Oracle жалуется на "ORA-00918: столбец неопределенно определен", как ожидалось.
Итак, может кто-нибудь помочь объяснить, как неопределенность определена в Oracle 10g? Или, возможно, это ошибка в 10g?
BTW: таблицы определены в схеме HR по умолчанию, входящей в состав Oracle 10g.
Обновление: просто нашел связанный пост:
Почему Oracle SQL загадочно разрешает двусмысленность в одном соединении и не участвует в других
Ответы
Ответ 1
Я считаю, что это ошибка в Oracle 10g, которую Oracle решил не исправлять. Когда мы обновляли наши приложения с 10g до 11gR2, мы обнаружили пару запросов, которые были написаны "свободно" в отношении неоднозначных имен столбцов, но работали в Oracle 10g. Все они перестали работать в 11gR2. Мы связались с Oracle, но они в значительной степени сказали, что толерантное поведение в отношении двусмысленных имен столбцов является правильным поведением для Oracle 10g, а строгий режим - правильное поведение для 11g.
Ответ 2
Я думаю, что это так, потому что у отделов нет alias
. Поэтому все, не имеющие квалификацию <alias>.
, сначала обрабатываются от departments
.
Поэтому я также думаю, что когда вы даете departments
псевдоним, вы должны снова получить ORA-00918. Не могу проверить здесь, хотя...