Oracle 11g第1版与第2版-左外部联接的不同行为
我在从Oracle 11g版本1升级到版本2后发现了这一点 我现在所能总结的最好情况是,在两个Oracle版本中,针对具有常量伪列和WHERE子句的查询的左外部联接会生成不同的结果。在版本2中,伪列显示在不匹配的行中:Oracle 11g第1版与第2版-左外部联接的不同行为,oracle,oracle11g,left-join,Oracle,Oracle11g,Left Join,我在从Oracle 11g版本1升级到版本2后发现了这一点 我现在所能总结的最好情况是,在两个Oracle版本中,针对具有常量伪列和WHERE子句的查询的左外部联接会生成不同的结果。在版本2中,伪列显示在不匹配的行中: TEST1 TEST2 ===== ===== A B A B - --- - --- 1 bar 1 hello 2 baz > SELECT * FROM test1 LEFT OUTER JOIN test2
TEST1 TEST2
===== =====
A B A B
- --- - ---
1 bar 1 hello
2 baz
> SELECT * FROM test1 LEFT OUTER JOIN test2 ON test1.a = test2.a;
A B A_1 B_1
- --- --- -----
1 bar 1 hello
2 baz
到目前为止,一切顺利。以上所有操作在Rel上都是相同的。1和2。现在,添加一个“伪”常量列X,事情就会按预期进行:
> SELECT *
FROM test1
LEFT OUTER JOIN (SELECT test2.*, 'X' AS X
FROM test2) test3
ON test1.a = test3.a;
A B A_1 B_1 X
- --- --- ----- -
1 bar 1 hello X
2 baz
现在,在第一个表中添加WHERE子句并获得不同的结果:
进一步的困惑:如果WHERE条件是数字的,例如WHERE test1.a<5,结果是相同的
更新以澄清我的实际问题:
我做错了什么?我的最终查询是否以某种方式调用了一个未定义的行为,使得Oracle可以更改从一个版本返回到下一个版本的内容?如果不是,这是Oracle的错误吗 所以我要回答我自己的问题,即:我是做错了什么,还是这是一个Oracle bug?这是一个Oracle错误 我让您来浏览support.oracle.com,但是正如@AdamHawkes所指出的,这个错误可能在最近的oracle补丁集中得到了解决。11.2.0.3版本说明中的几个bug似乎与我的问题相似,但并不完全相同
当我应用了最新的补丁程序时,我会尝试回到这里更新答案。我所处的环境不受我的控制。只是为其他读者链接一些相关帖子 主要建议更改会话以关闭特定优化。 alter session set\u optimizer\u join\u elimination\u enabled=false; alter session set\u optimizer\u native\u full\u outer\u join=off
我更希望他们的自动化测试能够证明简单的事情是可行的,而不是一开始就引入这些错误。如果这是一个问题,那么它就不是很清楚。@dystroy,我已经添加了一个更新,试图使我的问题更明确。这种详细程度可能更适合DBA stackexchange。但是,我只希望在11.1.0.7中出现这种行为。在11.2.0.2和11.2.0.3之间,关于外部联接有很多错误修复,特别是产生错误或不正确的结果。看起来你打了其中一个。
> SELECT *
FROM test1
LEFT OUTER JOIN (SELECT test2.*, 'X' AS X
FROM test2) test3
ON test1.a = test3.a
WHERE test1.b LIKE 'ba%';
Release 11.1.0.7.0 Release 11.2.0.2.0
================== ==================
A B A_1 B_1 X A B A_1 B_1 X
- --- --- ----- - - --- --- ----- -
1 bar 1 hello X 1 bar 1 hello X
2 baz 2 baz X <--- WHAT'S THIS?!