網頁

2017/9/30

Oracle outer join operator (+)

Oracle PL/SQL的(+)符號代表OUTER JOIN的意思。

不過Oracle官方直接建議還是直接使用OUTER JOIN語法,不建議使用舊的(+)語法。

此外在Java程式JDBC使用舊的(+)語法會導致ResultSet部分欄位的值為空,所以還是不要使用吧。

Outer join operator (+)使用範例如下。

-- RIGHT OUTER JOIN
SELECT * table_a a, table_b b
WHERE a.column_01(+) = b.column_03; -- right outer join

-- 上面的寫法相當於下面的RIGHT OUTER JOIN寫法
SELECT * FROM table_a a 
RIGHT OUTER JOIN table_b b ON a.column_01 = b.column_03;
-- RIGHT OUTER JOIN
SELECT * table_a a, table_b b
WHERE a.column_01(+) = b.column_03
AND a.column_02(+) = '123'
AND a.column_03 = 'X'; -- right outer join

-- 上面的寫法相當於下面的RIGHT OUTER JOIN寫法
SELECT * FROM table_a a 
RIGHT OUTER JOIN table_b b ON a.column_01 = b.column_03
                           AND a.column_02 = '123'
WHERE a.column_03 = 'X';
-- LEFT OUTER JOIN
SELECT * table_a a, table_b b
WHERE a.column_01 = b.column_03(+); -- left outer join

-- 上面的寫法相當於下面的LEFT OUTER JOIN寫法
SELECT * FROM table_a a 
LEFT OUTER JOIN table_b b ON a.column_01 = b.column_03;

以下是幾點使用上的限制:

  • 若查詢SQL的FROM子句有JOIN語法則不可使用(+),否則會出現ORA-25156:old style outer join (+) cannot be used with ANSI joins錯誤。
  • (+)只能用在WHERE子句。
  • (+)只能用在TABLE或VIEW的column上。
  • 如果一個TABLE是outer query,另外一個TABLE是inner query,則(+)無法產生outer join
  • (+)無法self outer join
  • (+)只能用在column上,不能用在表示式上。
  • WHERE條件中含有(+)則無法與OR一起使用,會出現ORA-01719:outer join operator (+) not allowed in operand of OR or IN錯誤
  • -- 下面會出現ORA-01719錯誤
    SELECT * table_a a, table_b b
    WHERE a.column_01(+) = b.column_03 
    OR a.column_01 > 100; -- 不能與OR一起使用
    
  • WHERE條件無法使用IN來與有(+)的column進行比較。
  • WHERE條件無法與子查詢中有(+)的column進行比較。


參考:

沒有留言:

張貼留言