我發現這個從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錯誤?
如果這是一個問題,它不是很清楚。 – 2012-07-06 16:21:29
@dystroy,我已經添加了一個更新,試圖讓我的問題明確。 – Arkady 2012-07-06 16:27:50
這個級別的細節可能更適合DBA堆棧交換。 – 2012-07-06 16:31:46