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ć.
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ładniFROM
klauzuliOUTER 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ładniFROM
klauzuliOUTER JOIN
:
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!
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 )
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
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:
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
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).
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