2011-08-31 97 views
4

我知道有很多这样的问题,但我的问题不是如何摆脱这个错误,而是知道如何在Oracle的第9版中更早地工作。Oracle:列模糊定义

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

我无法编辑Oracle数据库中的数据,只能读取。所以有两个表让我们说:表A(ID,名称,类型,客户)和表B(ID,A_ID,类型,人)

所以。有在源代码中的查询:

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

所以在甲骨文9这个完美工作,但现在我已经得到了“列含糊不清”的错误。

我想知道的是:

where type = 'A' 

相同

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

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

+3

我真的很惊讶,它在Oracle 9中工作。该查询应该从来没有工作。 –

+1

您是否将列TYPE添加到与迁移到Oracle 11相同的进程中的某个表中?或者,也许一个GRANT让你看到了其中的一列? – Benoit

+0

其实我不能回答这个问题,因为我不是DBA。所以我只是不知道这个数据库是如何迁移的( –

回答

5

我认为这是一个ANSI风格连接的错误。使用DBMS_XPLAN来查找旧数据库中正在过滤哪个表。或者更好的是,从业务逻辑中找出他们应该查询的内容。

+0

所以。感谢你们所有人的帮助。所以我终于找到了很久以前写这个查询的人,他向我解释了查询的逻辑。 –

5

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

where a.type = 'A' 

,或者它可能意味着

where b.type = 'A' 

他们有不同的结果;因此错误说明它被含糊地定义。

+0

是啊,我知道。但在oracle 9中没有这样的错误......所以它以某种方式工作并返回结果。所以现在为了避免这个错误,我必须修改查询,但我不明白这是如何工作的更早。 –

+1

@Andrey:测试Oracle 9中的模糊查询(您说它起作用)并检查输出以查看它使用哪一个:'where a.type ='A''或'where b.type =' A'' –

2

我想你应该在甲骨文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行,则基本查询被解释为QueryA。

类似地检查并将Query与BaseB进行比较。


另一个可行的原因的错误是在(或约具有相同的时间段)的迁移,是在第二表添加一个type柱。你有旧版本的数据库表的定义来检查?

+0

是的,我有。在这两个表中都有类型列。 –

1

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

这就是说你应该为它提供别名,所以它对于数据库服务器或DBA /开发者来说并不是不明确的。 :)