これは、Oracle 11g リリース 1 からリリース 2 にアップグレードした後に見つかりました。
私が今要約できる最善のことはLEFT OUTER JOIN
、一定の「偽の」列とWHERE
句を含むクエリに対して、2つのOracle RELEASEで異なる結果が生成されるということです。リリース 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 のバグですか?