【发布时间】: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 < 5,结果是一样的!
更新(澄清我的实际问题): 我做错了什么?我的最终查询是否以某种方式调用了未定义的行为,从而使 Oracle 可以将返回的内容从一个版本更改为下一个版本?如果不是,这是 Oracle 错误吗?
【问题讨论】:
-
如果这是个问题,那不是很清楚。
-
@dystroy,我添加了一个更新,试图明确我的问题。
-
这种详细程度可能更适合 DBA stackexchange。
-
但是,我只期望 11.1.0.7 中的行为。
-
在 11.2.0.2 和 11.2.0.3 之间有很多关于外连接的错误修复,特别是产生错误或不正确的结果。看起来你已经达到了其中之一。
标签: oracle oracle11g left-join