我从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上都是一样的。现在,添加一个'假'常量列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的错误吗?
答案 0 :(得分:0)
所以我要回答我自己的问题,即:“我做错了什么,或者这是Oracle的错误?” 这是一个Oracle错误。
我留给你来解决被称为 support.oracle.com 的疯狂行为,但是,正如@AdamHawkes所指出的,这个错误可能在最近的Oracle补丁集。 11.2.0.3发行说明中的几个错误看起来与我的问题类似,但并不完全相同。
当我获得最新的补丁时,我会尝试回到这里并更新答案(我处于一个我无法控制的环境中)。
答案 1 :(得分:0)
只为其他读者链接一些相关帖子..
https://forums.oracle.com/forums/thread.jspa?threadID=1113096
Strange behaviour of full outer join in Oracle - how it could be explained?
主要建议更改会话以关闭特定优化。 alter session set“_optimizer_join_elimination_enabled”= false; alter session set“_optimizer_native_full_outer_join”= off;
我宁愿他们进行自动化测试,这些测试证明了简单的工作原理并且不仅仅是首先介绍这些错误。