2010-10-26 8 views
117

Sprawdzam stare instrukcje SQL w celu ich udokumentowania i prawdopodobnie ich ulepszenia.Oracle "(+)" Operator

DBMS jest Oracle

nie rozumiałem oświadczenie, w którym przeczytać tak:

select ... 
from a,b 
where a.id=b.id(+) 

Jestem zagubiony operatora (+) i nie mógł dostać w żadnej forach ... (Szukanie + w cudzysłowach również nie działa).

Zresztą, kiedyś „Wyjaśnić plan” z sqldeveloper i mam wyjścia mówiące, że HASH JOIN, RIGHT OUTER itp

będzie tam żadnej różnicy jeśli usunąć operatora (+) na końcu zapytania? Czy baza danych musi spełniać pewne warunki (takie jak posiadanie indeksów itp.) Przed użyciem (+)? Byłoby bardzo pomocne, gdybyś mógł mi zapewnić proste zrozumienie lub dobre linki, na których mogę o tym przeczytać.

Dzięki!

Odpowiedz

147

To jest specyficzna notacja Oracle dla ZŁĄCZE ZEWNĘTRZNEJ, ponieważ format ANSI-89 (używając przecinka w klauzuli FROM do oddzielania odniesień do tabel) nie standaryzował sprzężeń OUTER.

zapytania może być ponownie napisany w ANSI 92 składni jako:

SELECT ... 
    FROM a 
LEFT JOIN b ON b.id = a.id 

This link is pretty good at explaining the difference between JOINs.


Należy również zauważyć, że chociaż (+) prace, Oracle recommends not using it:

Oracle zaleca stosowanie składni z FROM klauzula OUTER JOIN zamiast Oracle dołączyć operatora. Sprzężenie zewnętrzne zapytania używające Oracle dołączyć operatora (+) podlegają następującym zasadom i ograniczeniom, które nie odnoszą się do OUTER JOIN składni FROM klauzuli:

+0

Oh dzięki! - Nie spodziewałem się tego w ogóle !! – Sekhar

+60

Dokładnie w prawo. Aby utrzymać (+) prosto w mojej głowie (lewa strona a prawa strona), lubię myśleć o (+) jako o "dodawaniu wartości NULL, jeśli nie znaleziono żadnego dopasowania". Na przykład "a.id = b.id (+)" oznacza, że ​​b.id ma wartość NULL, jeśli nie pasuje do a.id. – beach

+0

dzięki .. Myślę, że dodanie go z klauzuli powinno przynieść ten sam wynik !! –

24

The (+) operator wskazuje na sprzężenie zewnętrzne. Oznacza to, że Oracle nadal będzie zwracać rekordy z drugiej strony sprzężenia, nawet jeśli nie będzie pasować. Na przykład, jeśli a i b są emp i dept i możesz mieć nieprzypisanych pracowników do działu, to poniższe oświadczenie zwróci szczegóły wszystkich pracowników, niezależnie od tego, czy zostali oni przypisani do działu.

select * from emp, dept where emp.dept_id=dept.dept_id(+) 

Krótko mówiąc, usunięcie (+) może spowodować różnicę istotności, ale możesz nie zauważyć przez jakiś czas w zależności od twoich danych!

5

W praktyce symbol + jest umieszczony bezpośrednio w instrukcji warunkowej i po stronie opcjonalnej tabeli (tej, która może zawierać puste lub wartości puste w warunku).

8

W Oracle (+) oznacza "opcjonalną" tabelę w JOIN.Tak więc w zapytaniu jest LEWA ZEWNĘTRZNA PRZYŁĄCZA tabelę "b" z tabelą "a". Podobnie jak w przypadku współczesnego zapytania dotyczącego łączenia lewostronnego. (Ja powraca wszystkie dane „na” stole bez utraty swoich danych po drugiej stronie opcjonalnego tabeli „B” może stracił swoje dane) enter image description here

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b ON a.id=b.id 

LUB

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b using(id) 

teraz po wyjęciu (+), to będzie normalnie sprzężenia wewnętrznego kwerendy

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id 

enter image description here

spowoduje, że wszystkie dane zostaną zwrócone, jeżeli "a" wartość "id" tabel "b" jest taka sama, czyli część wspólna.

Extra: Jeśli chcesz, aby Twoje zapytanie jak Prawo dołączyć w formacie starszej lub nowoczesny następnie pojawi się jako jak poniżej:

enter image description here

Stary:

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id(+)=b.id 

Modern:

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b ON a.id=b.id 

OR

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Right join b using(id) 

Ref & help:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Left Outer Join using + sign in Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp