Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:定义不明确的列_Oracle_Join_Defined - Fatal编程技术网

Oracle:定义不明确的列

Oracle:定义不明确的列,oracle,join,defined,Oracle,Join,Defined,我知道有很多类似的问题,但我的问题不是如何消除这个错误,而是如何在第9版的Oracle中了解它是如何工作的 我有一个用Ruby和OracleDB编写的旧源代码,最近升级到版本=11 我无法在Oracle DB中编辑数据,只能读取。所以有两个表:表A(id、名称、类型、客户)和表B(id、A_id、类型、人员) 所以。源代码中有一个查询: select a.id,b.id from a join b on a.id = b.a_id where type = 'A' 所以在Oracle9中,这工

我知道有很多类似的问题,但我的问题不是如何消除这个错误,而是如何在第9版的Oracle中了解它是如何工作的

我有一个用Ruby和OracleDB编写的旧源代码,最近升级到版本=11

我无法在Oracle DB中编辑数据,只能读取。所以有两个表:表A(id、名称、类型、客户)和表B(id、A_id、类型、人员)

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

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'
所以在Oracle9中,这工作得很好,但现在我遇到了“列定义模糊”错误

我想知道的是:

where type = 'A'

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


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

where a.type = 'A'
where b.type = 'A'
或者这可能意味着

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

具有潜在的不同结果;因此,错误是说它定义不明确。

我认为您应该在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'
以及:


这样做可以:

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'
(简而言之):

然后:

(QueryA)
MINUS
(Base)
如果上述两个
减号
查询都返回0行,则基本查询被解释为QueryA

类似地检查并比较Base和QueryB



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

我认为这是ANSI样式联接的一个错误。使用DBMS_XPLAN查找旧数据库中正在筛选的表


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

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


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

我真的很惊讶它在Oracle9中起作用。该查询不应该工作。您不是在迁移到Oracle 11的过程中将列类型添加到其中一个表中吗?或者可能是一笔拨款让你看到了其中一列?事实上,我不能回答这个问题,因为我不是DBA。所以我不知道这个数据库是如何迁移的(所以我问了DBA并得到了信息:旧的DB版本10.2.0.4.0-查询运行良好新的DB版本11.2.0.2.0-我得到了错误请为这两个表添加真实的ddl,我知道真实的QueryEAH。但是在oracle 9中没有这样的错误…所以它以某种方式工作并返回结果。所以现在为了避免这个错误,我必须修改查询b。)但我不明白之前是如何工作的。@Andrey:在oracle9中测试这个不明确的查询(你说它在哪里工作)然后检查输出,看看它使用的是哪两个:
其中a.type='a'
还是
其中b.type='a'
所以。谢谢大家的帮助。所以我终于找到了很久以前编写这个查询的人,他向我解释了查询的逻辑。
(QueryA)
MINUS
(Base)