AFAIK, (+) notacja jest obecna tylko w celu zapewnienia kompatybilności wstecznej, ponieważ Oracle zadebiutowała przed wprowadzeniem standardu ANSI dla złączeń. Jest specyficzny dla Oracle i należy unikać używania go w nowym kodzie, gdy dostępna jest równoważna wersja zgodna ze standardami.
Wygląda na to, że istnieją różnice między tymi dwoma, a (+) notacja ma ograniczenia, których nie ma składnia złączenia ANSI. Same Oracle zalecają, aby nie używać (+) notation.Pełny opis tutaj w Oracle® Database SQL Language Reference11g Release 1 (11.1):
Oracle zaleca używanie FROM klauzula OUTER JOIN składni, a nie operatora łączenia Oracle. Zapytania sprzężenia zewnętrznego, które używają operatora sprzężenia Oracle (+) podlegają następującym zasadom i ograniczeniom, które nie dotyczą FROM klauzula OUTER JOIN składnia:
- Nie możesz określić
(+)operator w bloku zapytania, który zawiera równieżFROMskładnia łączenia klauzul. (+)operator może pojawić się tylko wWHERElub w kontekście lewostronnej korelacji (przy określeniuTABLEklauzula) wFROMklauzula i może być stosowana tylko do kolumny tabeli lub widoku.- Jeśli A i B są połączone wieloma warunkami złączenia, musisz użyć
(+)we wszystkich tych warunkach. Jeśli tego nie zrobisz, Oracle Database zwróci tylko wiersze będące wynikiem prostego sprzężenia, ale bez ostrzeżenia lub błędu informującego, że nie masz wyników sprzężenia zewnętrznego. (+)operator nie tworzy sprzężenia zewnętrznego, jeśli określisz jedną tabelę w zapytaniu zewnętrznym, a drugą tabelę w zapytaniu wewnętrznym.- Nie możesz użyć
(+)operatora do zewnętrznego dołączania tabeli do siebie, chociaż self join są poprawne.
Na przykład poniższe oświadczenie jest nieprawidłowe:
SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;
Jednak następujące samodołączenie jest prawidłowe:
SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
(+)Operator można zastosować tylko do kolumny, a nie do dowolnego wyrażenia. Jednak dowolne wyrażenie może zawierać jedną lub więcej kolumn oznaczonych(+)operator.- A
WHEREwarunek zawierający(+)operatora nie można łączyć z innym warunkiem za pomocąORoperator logiczny. - A
WHEREwarunek nie może używaćINwarunek porównania do porównania kolumny oznaczonej(+)operator z wyrażeniem.
Jeśli WHERE klauzula zawiera warunek porównujący kolumnę z tabeli B ze stałą, a następnie (+) operator musi zostać zastosowany do kolumny, aby Oracle zwróciła wiersze z tabeli A, dla której wygenerował wartości null dla tej kolumny. W przeciwnym razie Oracle zwraca tylko wyniki prostego złączenia.
W zapytaniu, które wykonuje sprzężenia zewnętrzne więcej niż dwóch par tabel, pojedyncza tabela może być tabelą generowaną przez wartość NULL tylko dla jednej innej tabeli. Z tego powodu nie możesz zastosować (+) operator do kolumn B w warunku złączenia dla A i B oraz warunku złączenia dla B i C. Zobacz SELECT dla składni dla zewnętrznego sprzężenia.