2012-07-06 88 views
7

我發現這個從Oracle 11g第1版升級到第2版Oracle 11g發行1對2 - 不同的行爲LEFT OUTER JOIN的

後最好我可以總結一下,現在是一個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相同。 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,結果都是一樣的

UPDATE(澄清我的實際問題): 我做錯了什麼?我的最終查詢以某種方式調用了未定義的行爲,使得Oracle可以更改從一個發行版返回到下一個版本的行爲嗎?如果不是,這是一個Oracle錯誤?

+0

如果這是一個問題,它不是很清楚。 – 2012-07-06 16:21:29

+0

@dystroy,我已經添加了一個更新,試圖讓我的問題明確。 – Arkady 2012-07-06 16:27:50

+0

這個級別的細節可能更適合DBA堆棧交換。 – 2012-07-06 16:31:46

回答

0

所以我要回答我自己的問題,即:「我做錯了什麼,或者這是一個Oracle錯誤?」與這是一個Oracle錯誤

我把它留給你瀏覽稱爲support.oracle.com的瘋狂,但是,正如@AdamHawkes指出,這個bug是可能在最近的Oracle補丁集解決。發佈到11.2.0.3的註釋中的一些錯誤看起來與我的問題類似,儘管不完全相同。

當我得到最新的補丁程序(我處於我無法控制的環境中)時,我會嘗試返回並更新答案。

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;

我寧願他們有自動化測試,證明簡單的事情工作,並不只是引入這些錯誤。