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 11g第1版与第2版-左外部联接的不同行为_Oracle_Oracle11g_Left Join - Fatal编程技术网

Oracle 11g第1版与第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

我在从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 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?!