Oracle 11g第1版与第2版 – LEFT OUTER JOIN的不同行为

前端之家收集整理的这篇文章主要介绍了Oracle 11g第1版与第2版 – LEFT OUTER JOIN的不同行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从Oracle 11g第1版升级到第2版后,我发现了这一点.

我现在可以总结的最好的事情是,针对具有常量“假”列和WHERE子句的查询的LEFT OUTER JOIN会在两个Oracle RELEASES中生成不同的结果.在版本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上都是一样的.现在,添加一个’假’常量列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子句并获得不同的结果:

> 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?!

进一步的困惑:如果WHERE条件是数字(例如,WHERE test1.a< 5,结果是相同的! 更新(澄清我的实际问题):
我做错了什么?我的最终查询是否以某种方式调用了未定义的行为,以便Oracle可以将从一个版本返回的内容更改为下一个版本?如果没有,这是Oracle的错误吗?

所以我要回答我自己的问题,即:“我做错了什么还是这个Oracle漏洞?”这是一个Oracle错误.

我把它留给你来解决这个名为support.oracle.com的疯狂行为,但正如@AdamHawkes所指出的,这个bug可能是在最近的Oracle补丁集中解决的. 11.2.0.3发行说明中的​​几个错误看起来与我的问题类似,但并不完全相同.

当我得到最新的补丁(我处于一个我无法控制的环境中)时,我会尝试回到这里并更新答案.

猜你在找的Oracle相关文章