我正在使用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应该抱怨where子句中department_id
的含糊不清,因为它是表employees
和departments
中的一列。事实是在Oracle 10g中,它没有,结果表明它将department_id
解释为departments
中的{{1}}。但是,如果我注释掉第二个连接语句(上面的第4行),Oracle会按预期抱怨“ORA-00918:列模糊定义”。
那么,有人可以帮助解释如何在Oracle 10g中定义歧义吗?或者这可能是10g中的一个错误?
BTW:这些表是在Oracle 10g中捆绑的默认HR模式中定义的。
更新:刚发现相关帖子: Why does Oracle SQL mysteriously resolve ambiguity in one joins and does not in others
答案 0 :(得分:10)
我认为这是甲骨文选择不修复的Oracle 10g中的一个错误。当我们将应用程序从10g升级到11gR2时,我们发现了一些关于模糊列名称“松散地”编写但在Oracle 10g中工作的查询。他们都停止了11gR2的工作。我们联系了Oracle,但是他们几乎都说过对模糊列名的容忍行为是Oracle 10g的正确行为,严格的行为是11g的正确行为。
答案 1 :(得分:1)
我认为是,因为部门没有alias
。因此,未经<alias>.
限定的所有内容首先被视为来自departments
。
所以我也认为当你给departments
别名时,你应该再次获得ORA-00918。虽然不能在这里测试......