4

我知道有很多这样的问题,但我的问题不是如何摆脱这个错误,而是要知道它在早期的 9 版 Oracle 中是如何工作的。

我有一个用 Ruby 和 Oracle DB 编写的旧资源,最近升级到 version=11。

我无法编辑 Oracle DB 中的数据,只能读取。所以有两个表可以说:表A(id,name,type,customer)和表B(id,a_id,type,person)

所以。源码中有一个查询:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

所以在 Oracle 9 中这工作得很好,但现在我遇到了“列不明确定义”错误。

我想知道的是:

where type = 'A'

是相同的

where a.type = 'A' AND b.type = 'A'

或者

where a.type = 'A' OR b.type = 'A'

?

4

4 回答 4

5

不,这就是问题所在:这可能意味着

where a.type = 'A'

或者这可能意味着

where b.type = 'A'

可能产生不同的结果;因此错误说它的定义不明确。

于 2011-08-31T08:39:04.390 回答
5

我认为这是 ANSI 样式连接的错误。使用 DBMS_XPLAN 查找旧数据库中正在过滤的表。

或者更好的是,从业务逻辑中找出他们查询的应该是什么。

于 2011-08-31T09:50:08.630 回答
2

我认为您应该在 Oracle 9 中进行测试(您说它可以工作)并比较模棱两可的查询的输出:

--- Base
select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

与两个非模棱两可的:

--- QueryA
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

和:

--- QueryB
select a.id,b.id from a join b on a.id = b.a_id where b.type = 'A'

这样的事情会做:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'
MINUS
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

(简而言之):

(Base)
MINUS
(QueryA)

进而:

(QueryA)
MINUS
(Base)

如果上述两个MINUS查询都返回 0 行,则 BASE 查询被解释为 QueryA。

类似地检查并将 Base 与 QueryB 进行比较。


此错误的另一个可能原因是在迁移期间(或大约在同一时期)迁移,type在第二个表中添加了一个列。你有旧版本的数据库表定义来检查吗?

于 2011-08-31T09:01:26.513 回答
1

全部 - 请记住,11g 的优化引擎发生了重大变化。如果您在 11g 实例上将查询优化器级别设置为 10.2.x,我敢打赌查询将再次开始工作。

话虽这么说,您应该为它提供别名,这样数据库服务器或后面的 DBA / 开发人员就不会模棱两可了。:)

于 2011-09-01T02:09:44.587 回答