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żFROM
składnia łączenia klauzul. (+)
operator może pojawić się tylko wWHERE
lub w kontekście lewostronnej korelacji (przy określeniuTABLE
klauzula) wFROM
klauzula 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
WHERE
warunek zawierający(+)
operatora nie można łączyć z innym warunkiem za pomocąOR
operator logiczny. - A
WHERE
warunek nie może używaćIN
warunek 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.