Подтвердить что ты не робот

Почему 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 загадочно разрешает двусмысленность в одном соединении и не участвует в других

4b9b3361

Ответ 1

Я считаю, что это ошибка в Oracle 10g, которую Oracle решил не исправлять. Когда мы обновляли наши приложения с 10g до 11gR2, мы обнаружили пару запросов, которые были написаны "свободно" в отношении неоднозначных имен столбцов, но работали в Oracle 10g. Все они перестали работать в 11gR2. Мы связались с Oracle, но они в значительной степени сказали, что толерантное поведение в отношении двусмысленных имен столбцов является правильным поведением для Oracle 10g, а строгий режим - правильное поведение для 11g.

Ответ 2

Я думаю, что это так, потому что у отделов нет alias. Поэтому все, не имеющие квалификацию <alias>., сначала обрабатываются от departments.

Поэтому я также думаю, что когда вы даете departments псевдоним, вы должны снова получить ORA-00918. Не могу проверить здесь, хотя...