Oracle SQL 在没有 UNION 的情况下给出 ORA-01790,并且解决方法的工作效果很奇怪。为什么?

问题描述 投票:0回答:1

我们有一个Oracle视图“view1”,其SQL是这样的:

select ...,
       nvl(iac.indirect_attri_cost, 0) + nvl(pc.premises_cost, 0) + nvl(cc.central_cost, 0) total_cost
from   (select ..., cc.CENTRAL_COST 
        from   .. cc, .. rl
        where  ...) cc
full   outer join (select ...) iac
on     ...
full   outer join (select ...) pc
on     ...
left   join ... dept
on     ...

注意我们显示的 CENTRAL_COST 字段。

效果很好。

但是我们的另一个视图“view2”使用了这个 view1,并且它崩溃并显示“ORA-01790 表达式必须与相应表达式具有相同的数据类型”:

select * from view1

是的,就这样。

我们意识到数据类型有问题,好吧,然后我们在 View1 中找到了解决方法,即用 TO_CHAR 包装该列,稍后再用 TO_NUMBER 包装该列(用于计算目的):

select ...,
       nvl(iac.indirect_attri_cost, 0) + nvl(pc.premises_cost, 0) + nvl(TO_NUMBER(cc.central_cost), 0) total_cost
from   (select ..., TO_CHAR(cc.CENTRAL_COST)
        from   .. cc, .. rl
        where  ...) cc
full   outer join (select ...) iac
on     ...
full   outer join (select ...) pc
on     ...
left   join ... dept
on     ...

修改后的view1在view2中工作正常。但是我们不明白出了什么问题以及如何解决!

更进一步,我们发现在 view1 中应用不同的优化目标可以绕过该错误。这让我们更加困惑!

有人可以提供一些见解吗?非常感谢。

sql oracle
1个回答
0
投票

来自 Oracle 博客:链接
“在 Oracle 数据库 11g 第 1 版之前,所有 ANSI 完整外连接都转换为具有两个分支的 UNION ALL 查询,其中一个分支包含左外连接横向视图,另一个分支包含 NOT EXISTS 子查询。对哈希完整外连接的本机支持是Oracle 数据库 11g 第 1 版中引入了解决此问题的方法 当无法使用本机完全外连接时,Oracle 恢复到 11gR1 之前的策略)

您可能使用高于 11gR1 的 Oracle 版本,因此请尝试再次检查您的数据,并尝试找出是否有某些因素可能导致 Oracle 决定无法使用全外连接。阅读不同查询的解释平面。这可以解释您问题中描述的“异常”。

© www.soinside.com 2019 - 2024. All rights reserved.