Operator Oracle "(+)"

Sprawdzam niektóre stare instrukcje SQL w celu ich udokumentowania i prawdopodobnie ulepszenia.

DBMS to Oracle

Nie zrozumiałem stwierdzenia, które brzmiało tak:

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

Jestem zdezorientowany co do operatora (+) i nie mogłem go zdobyć na żadnym forum... (wyszukiwanie + w cudzysłowach też nie działało).

W każdym razie, użyłem 'Explain Plan' SQLDeveloper i dostałem wyjście mówiące, że HASH JOIN, RIGHT OUTER, itp.

Czy byłaby jakaś różnica jeśli usunę operator (+) na końcu zapytania? Czy baza danych musi spełniać jakiś warunek (np. mieć jakieś indeksy itp.) zanim (+) będzie można użyć?? Byłoby bardzo pomocne, jeśli możesz podać mi proste zrozumienie lub kilka dobrych linków, gdzie mogę o tym przeczytać.

Dzięki!
Author: Óscar Gómez Alcañiz, 2010-10-26

4 answers

To specyficzna notacja Oracle dla połączenia zewnętrznego, ponieważ format ANSI-89 (używając przecinka w klauzuli FROM do oddzielnych odniesień do tabeli) nie ustandaryzował połączeń zewnętrznych.

Zapytanie zostanie zapisane ponownie w składni ANSI-92 jako:

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

Ten link jest całkiem dobry w wyjaśnianiu różnicy między połączeniami .


Należy również zauważyć, że chociaż (+) działa, Oracle zaleca , a nie używanie go :

Oracle zaleca stosowanie składni FROMklauzuli OUTER JOIN zamiast operatora Oracle join. Zewnętrzne zapytania join, które używają operatora Oracle join (+) podlegają następującym zasadom i ograniczeniom, które nie mają zastosowania do składni FROM klauzuli OUTER JOIN:
 157
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 18:40:35

Operator (+) wskazuje złącze zewnętrzne. Oznacza to, że Oracle nadal będzie zwracać rekordy z drugiej strony połączenia, nawet jeśli nie ma dopasowania. Na przykład, Jeśli a i b są emp i dept i możesz mieć pracowników nieprzypisanych do działu, następujące oświadczenie zwróci szczegóły wszystkich pracowników, niezależnie od tego, czy zostali przypisani do działu.

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

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

 24
Author: hot dog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 12:09:16

W Oracle, (+) oznacza "opcjonalną" tabelę w połączeniu. Więc w zapytaniu

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

Jest to lewa zewnętrzna tablica łącząca 'B' z 'a'. Jak nowoczesna lewa Dołącz zapytanie. (zwróci wszystkie dane z tabeli " a "bez utraty swoich danych po drugiej stronie opcjonalna tabela" b " może utracić swoje dane ) Tutaj wpisz opis obrazka

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 jeśli usuniesz ( + ) to będzie to normalne wewnętrzne zapytanie join,

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

Tutaj wpisz opis obrazka

Zwróci tylko wszystkie dane, w których wartość " a " i " b "tabel" id " jest taka sama, oznaczają część wspólną.

Extra: jeśli chcesz, aby Twoje zapytanie było poprawnie dołączone w starszym formacie lub nowoczesnym, pojawi się ono następująco:

Tutaj wpisz opis obrazka

Stary:

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

Nowoczesny:

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

Lub

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

 14
Author: Md. Salman Fahad Famous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 05:48:03

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

 5
Author: sunny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 17:21:45