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,结果是相同的! 更新(澄清我的实际问题): 我把它留给你来解决这个名为support.oracle.com的疯狂行为,但正如@AdamHawkes所指出的,这个bug可能是在最近的Oracle补丁集中解决的. 11.2.0.3发行说明中的??几个错误看起来与我的问题类似,但并不完全相同. 当我得到最新的补丁(我处于一个我无法控制的环境中)时,我会尝试回到这里并更新答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |