Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Różnica między notacją Oracle plus (+) a notacją ansi JOIN?

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 w WHERE lub w kontekście lewostronnej korelacji (przy określeniu TABLE klauzula) w FROM 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. string literał za długi - jak przypisać długie dane xml do typu danych clob w oracle 11g r2

  2. Jak wyświetlić komentarze kolumny z operacją desc

  3. Wielkie litery w nazwiskach osób w programowaniu

  4. Oracle wstawia się do tabeli 2, a następnie usuwa z tabeli 1, wyjątek w przypadku niepowodzenia

  5. Jak rozwiązać ORA-00900