我在从 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 错误吗?