我知道有很多类似这样的问题,但我的问题不是如何摆脱这个错误,而是要知道这在第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'
答案 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来说它并不含糊。 :)