Я обнаружил это после обновления Oracle 11g Release 1 до Release 2.
Лучшее, что я могу обобщить прямо сейчас, это то, что LEFT OUTER JOIN
против запроса с постоянным «фальшивым» столбцом и предложением WHERE
генерирует разные результаты в двух ВЫПУСКАХ Oracle. В выпуске 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?