Sprawdzam kilka starych instrukcji SQL w celu ich udokumentowania i prawdopodobnie ulepszenia.
DBMS to Oracle
Nie rozumiem 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 znaleźć na żadnym forach ... (wyszukiwanie + w cudzysłowie też nie działało).
W każdym razie użyłem `` Explain Plan '' programu SQLDeveloper i otrzymałem wynik z informacją, ż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 (taki jak posiadanie pewnych indeksów itp.), Zanim (+)
będzie można jej użyć? Byłoby bardzo pomocne, gdybyś mógł mi podać proste zrozumienie lub kilka dobrych linków, w których mogę o tym przeczytać.
Dzięki!
sql
oracle
join
outer-join
Sekhar
źródło
źródło
Odpowiedzi:
Jest to notacja specyficzna dla Oracle dla OUTER JOIN, ponieważ format ANSI-89 (używający przecinka w klauzuli FROM do oddzielenia odniesień do tabel) nie standaryzował złączeń OUTER.
Zapytanie zostanie przepisane w składni ANSI-92 jako:
Ten link całkiem dobrze wyjaśnia różnicę między połączeniami JOIN .
Należy również zauważyć, że chociaż
(+)
prace, Oracle zaleca nie jest używany :źródło
Operator (+) wskazuje sprzężenie zewnętrzne. Oznacza to, że Oracle nadal zwraca rekordy z drugiej strony sprzężenia, nawet jeśli nie ma dopasowania. Na przykład, jeśli a i b to emp i dept i możesz mieć pracowników nieprzypisanych do działu, poniższa instrukcja zwróci szczegóły wszystkich pracowników, niezależnie od tego, czy zostali przypisani do działu.
Krótko mówiąc, usunięcie (+) może spowodować istotną różnicę, ale w zależności od danych możesz nie zauważyć przez chwilę!
źródło
W Oracle (+) oznacza „opcjonalną” tabelę w JOIN. W swoim zapytaniu
jest to LEWE POŁĄCZENIE ZEWNĘTRZNE tabeli „b” do tabeli „a”. Zwróci wszystkie dane z tabeli „a” bez utraty danych, jeśli po drugiej stronie (opcjonalna tabela „b”) nie ma żadnych danych.
Nowoczesna standardowa składnia dla tego samego zapytania byłaby
lub ze skrótem dla
a.id=b.id
(nie obsługiwane przez wszystkie bazy danych):Jeśli usuniesz (+), będzie to normalne zapytanie sprzężenia wewnętrznego
Starsza składnia, zarówno w Oracle, jak i innych bazach danych:
Bardziej nowoczesna składnia:
Lub po prostu:
Zwróci tylko wszystkie dane, w których wartość identyfikatora obu tabel „a” i „b” jest taka sama, czyli część wspólna.
Jeśli chcesz, aby twoje zapytanie było prawidłowe
To jest to samo, co LEFT JOIN, ale przełącza, która tabela jest opcjonalna.
Stara składnia Oracle:
Nowoczesna standardowa składnia:
Odwołanie i pomoc:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Left Outer Join za pomocą + Zaloguj się w Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
źródło
W praktyce symbol + jest umieszczany bezpośrednio w instrukcji warunkowej i po stronie opcjonalnej tabeli (takiej, która w warunku może zawierać wartości puste lub zerowe).
źródło