Oracle:列模糊定义

时间:2011-08-31 08:33:12

标签: oracle join defined

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

我有一个用Ruby和Oracle DB编写的旧资源,最近已升级到版本= 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 个答案:

答案 0 :(得分:5)

不,那就是问题:可能意味着

where a.type = 'A'

或者它可能意味着

where b.type = 'A'

可能会有不同的结果;因此错误说它的含义模糊不清。

答案 1 :(得分:5)

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

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

答案 2 :(得分: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列。您是否有旧版本的数据库表定义来检查它?

答案 3 :(得分:1)

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

那就是说你应该为它提供别名,这样对于数据库服务器或后面的DBA / Developer来说它并不含糊。 :)