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
;

问题是我认为 Oracle 应该抱怨department_idwhere 子句中的歧义,因为它是 tableemployeesdepartments. 事实是在 Oracle 10g 中,它没有,结果表明它将 解释department_iddepartments. 但是,如果我注释掉第二个连接语句(上面的第 4 行),Oracle 会按预期抱怨“ORA-00918:列不明确定义”。

那么,有人可以帮助解释一下 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. 因此,所有没有被 an 限定的东西都<alias>.首先被视为 from departments

所以我还认为,当您提供departments别名时,您应该再次获得 ORA-00918。虽然不能在这里测试...

于 2011-06-09T13:36:26.997 回答