Oracle 11g Release 1 и 2 — другое поведение LEFT OUTER JOIN

Я обнаружил это после обновления 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?

7
задан Arkady 6 July 2012 в 16:27
поделиться