Почему 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? А может это глюк в 10г?

Кстати: таблицы определены в схеме HR по умолчанию, включенной в Oracle 10g.

Обновление: только что нашел связанный пост: Почему Oracle SQL таинственным образом разрешает неоднозначность в одних соединениях и не разрешает их в других


person Sapience    schedule 09.06.2011    source источник
comment
Может быть, это потому, что он единственный без псевдонима. Так что все без «алиаса». перед сначала рассматривается как что-то из отделов. Получается ли у вас ошибка ORA, когда вы также даете отделам псевдоним?   -  person Fabian Barney    schedule 09.06.2011
comment
используя 11gr2, я не могу воссоздать это (всегда получаю ORA-00918). Может быть, попробуйте Beta 11gR2 XE и посмотрите, сможете ли вы воссоздать. Похоже на ошибку   -  person Harrison    schedule 09.06.2011
comment
@Fatal псевдоним не решает загадки. select * from employees manager join employees worker on MANAGER.EMPLOYEE_ID = WORKER.MANAGER_ID join departments depts on depts.manager_id = 108 where department_id = 100 ;   -  person Sapience    schedule 09.06.2011
comment
@ Харрисон, спасибо. Есть ли база данных ошибок Oracle 10g, в которой регистрируется эта ошибка?   -  person Sapience    schedule 09.06.2011
comment
Когда вы делаете явным условие объединения для отделов. Вы тогда получаете сообщение об ошибке?   -  person Fabian Barney    schedule 09.06.2011
comment
У меня нет 10g для воспроизведения, но не могли бы вы попробовать соединиться в старом стиле, если получите ORA00918? SELECT * FROM employees manager, employees worker, departments WHERE MANAGER.EMPLOYEE_ID = WORKER.MANAGER_ID AND DEPARTMENTS.manager_id = 108 AND department_id = 100 ;   -  person mcha    schedule 09.06.2011
comment
@mcha да, 10g жалуется на ошибку неоднозначности ORA00918 для вашего запроса. @Fatal Я не уверен, что вы имеете в виду, говоря о явном условии соединения? не могли бы вы написать запрос, который хотите проверить?   -  person Sapience    schedule 09.06.2011
comment
Я видел то же самое на 10g и из-за этого получал неверные результаты. Но я не стал пытаться выяснить, у кого есть контакты поддержки с Oracle, я просто квалифицировал столбец, чтобы получить правильные результаты.   -  person Shannon Severance    schedule 09.06.2011
comment
Используйте EXPLAIN PLAN и DBMS_XPLAN.DISPLAY_CURSOR, и предикаты фильтра / доступа покажут, какой «идентификатор_отдела» используется.   -  person Gary Myers    schedule 10.06.2011
comment
Это ошибка в некоторых версиях Oracle. Для получения конкретной справки по поддержке Oracle и затронутых версий см. Мой ответ на другой похожий вопрос: stackoverflow.com/a/4306406/4632   -  person BQ.    schedule 10.05.2012


Ответы (2)


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

person Olaf    schedule 09.06.2011
comment
Правильное поведение в 10г? Кто-то @ Oracle пускает дым. - person Shannon Severance; 09.06.2011
comment
@SShannon Severance: Они просто пытаются всех перевести на 11g и 11gR2. Я считаю, что начиная с 1 июля лицензиат, который решит придерживаться 10g, должен будет перейти на более высокий уровень поддержки и, соответственно, заплатить более высокий лицензионный сбор. - person Olaf; 09.06.2011
comment
Это исправлено в некоторых версиях 10g. Для получения конкретной справки по поддержке Oracle и затронутых версий см. Мой ответ на другой похожий вопрос: stackoverflow.com/a/4306406/4632 - person BQ.; 10.05.2012

Думаю, да, потому что в отделах нет alias. Следовательно, все, что не квалифицируется <alias>., сначала рассматривается как исходящее от departments.

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

person Fabian Barney    schedule 09.06.2011
comment
Я только что тестировал, и дело не в этом, даже я даю псевдоним отделам, показывает тот же результат без ошибок. - person Sapience; 09.06.2011