【问题标题】:Oracle 11g Release 1 vs. 2 — different behavior of LEFT OUTER JOINOracle 11g 第 1 版与第 2 版 — LEFT OUTER JOIN 的不同行为
【发布时间】:2012-07-06 16:19:25
【问题描述】:

我是在从 Oracle 11g 第 1 版升级到第 2 版后发现的。

我现在可以总结的最好的一点是LEFT OUTER JOIN 针对具有恒定“假”列的查询和WHERE 子句在两个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 上都相同。 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 子句并获得不同的结果:

> 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 &lt; 5,结果是一样的!

更新(澄清我的实际问题): 我做错了什么?我的最终查询是否以某种方式调用了未定义的行为,从而使 Oracle 可以将返回的内容从一个版本更改为下一个版本?如果不是,这是 Oracle 错误吗?

【问题讨论】:

  • 如果这是个问题,那不是很清楚。
  • @dystroy,我添加了一个更新,试图明确我的问题。
  • 这种详细程度可能更适合 DBA stackexchange。
  • 但是,我只期望 11.1.0.7 中的行为。
  • 在 11.2.0.2 和 11.2.0.3 之间有很多关于外连接的错误修复,特别是产生错误或不正确的结果。看起来你已经达到了其中之一。

标签: oracle oracle11g left-join


【解决方案1】:

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

我让你来解决被称为 support.oracle.com 的疯狂问题,但是,正如 @AdamHawkes 所指出的,这个错误可能在最近的 Oracle 补丁集。 11.2.0.3 的发行说明中的​​一些错误似乎与我的问题相似,但并不完全相同。

当我应用了最新的补丁后,我会尝试回到这里并更新答案(我处于无法控制此问题的环境中)。

【讨论】:

    【解决方案2】:

    只是为其他读者链接一些相关的帖子..

    https://forums.oracle.com/forums/thread.jspa?threadID=1113096

    Strange behaviour of full outer join in Oracle - how it could be explained?

    主要建议更改会话以关闭特定优化。 更改会话集“_optimizer_join_elimination_enabled”= false; 更改会话集 "_optimizer_native_full_outer_join"=off;

    我宁愿他们有自动化测试,证明简单的事情是有效的,而不是一开始就引入这些错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2014-09-22
      • 2015-04-02
      • 2010-09-29
      • 1970-01-01
      • 2014-10-18
      相关资源
      最近更新 更多