Czy ktoś może mi powiedzieć, czy poniżej 2 zapytań są przykładem Left Outer Join lub Right Outer Join?
Table Part:
Name Null? Type
PART_ID NOT NULL VARCHAR2(4)
SUPPLIER_ID VARCHAR2(4)
PART_ID SUPPLIER_ID
P1 S1
P2 S2
P3
P4
Table Supplier:
Name Null? Type
SUPPLIER_ID NOT NULL VARCHAR2(4)
SUPPLIER_NAME NOT NULL VARCHAR2(20)
SUPPLIER_ID SUPPLIER_NAME
S1 Supplier#1
S2 Supplier#2
S3 Supplier#3
Wyświetl wszystkie części niezależnie od tego, czy dostawca je dostarcza, czy nie:
SELECT P.Part_Id, S.Supplier_Name Z Części P, Dostawca S GDZIE P.Supplier_Id = S.Supplier_Id (+) SELECT P.Part_Id, S.Supplier_Name Z Części P, Dostawca S GDZIE S.Supplier_Id (+) = P.Supplier_Id
Odpowiedzi:
TableA LEFT OUTER JOIN TableB
jest równoważneTableB RIGHT OUTER JOIN Table A
.W Oracle
(+)
oznacza „opcjonalną” tabelę w JOIN. Więc w pierwszym zapytaniu jest to plikP LEFT OUTER JOIN S
. W drugim zapytaniu toS RIGHT OUTER JOIN P
. Są funkcjonalnie równoważne.W terminologii PRAWO lub LEWO określ, która strona sprzężenia zawsze ma rekord, a druga strona może być zerowa. Więc w a
P LEFT OUTER JOIN S
,P
zawsze będzie miał rekord, ponieważ jest naLEFT
, aleS
może być pusty.Dodatkowe wyjaśnienia można znaleźć w przykładzie z witryny java2s.com .
Aby wyjaśnić, myślę, że mówię, że terminologia nie ma znaczenia, ponieważ służy tylko do wizualizacji. Liczy się to, że rozumiesz koncepcję tego, jak to działa.
PRAWO vs LEWO
Widziałem pewne zamieszanie dotyczące tego, co ma znaczenie przy określaniu PRAWEGO i LEWEGO w niejawnej składni sprzężenia.
LEWE POŁĄCZENIE ZEWNĘTRZNE
SELECT * FROM A, B WHERE A.column = B.column(+)
PRAWE POŁĄCZENIE ZEWNĘTRZNE
SELECT * FROM A, B WHERE B.column(+) = A.column
Wszystko, co zrobiłem, to zamienić strony terminów w klauzuli WHERE, ale nadal są one funkcjonalnie równoważne. (Zobacz wyżej w mojej odpowiedzi, aby uzyskać więcej informacji na ten temat.) Umiejscowienie
(+)
określa PRAWO lub LEWO. (W szczególności, jeśli(+)
znajduje się po prawej stronie, jest to LEWE POŁĄCZENIE. Jeśli(+)
jest po lewej stronie, jest to PRAWE POŁĄCZENIE).Rodzaje JOIN
Dwa style JOIN to niejawne JOIN i jawne JOIN . Są to różne style pisania JOIN, ale są one funkcjonalnie równoważne.
Zobacz to pytanie SO .
Niejawne JOIN po prostu wyświetlają wszystkie tabele razem. Warunki łączenia są określone w klauzuli WHERE.
Niejawne JOIN
SELECT * FROM A, B WHERE A.column = B.column(+)
Jawne JOIN kojarzą warunki łączenia z włączeniem konkretnej tabeli zamiast z klauzulą WHERE.
Wyraźne JOIN
SELECT * FROM A LEFT OUTER JOIN B ON A.column = B.column
Te niejawne JOIN mogą być trudniejsze do odczytania i zrozumienia, a także mają kilka ograniczeń, ponieważ warunki łączenia są mieszane w innych warunkach WHERE. W związku z tym niejawne JOIN są generalnie zalecane na rzecz jawnej składni.
źródło
JOIN
zamiast tego użyj idiomatycznej składni! Wtedy nie ma miejsca na zamieszanie.FULL OUTER JOIN
składni będziesz potrzebowaćUNION [ALL]
dwóch zestawów wyników: jednego dla A = B (+) i jednego dla B = A (+). Przykład w tym pytaniu .Te dwa zapytania działają
OUTER JOIN
. Zobacz poniżejZrobiono z http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm
źródło
Widziałem pewne sprzeczności w powyższych odpowiedziach, właśnie wypróbowałem następujące na Oracle 12c i poniższe są poprawne:
SELECT * FROM A, B WHERE A.column = B.column(+)
SELECT * FROM A, B WHERE B.column(+) = A.column
źródło
LEWE POŁĄCZENIE ZEWNĘTRZNE
WYBIERZ * Z A, B GDZIE A. kolumna = B. kolumna (+)
PRAWE POŁĄCZENIE ZEWNĘTRZNE
WYBIERZ * Z A, B GDZIE A. kolumna (+) = B. kolumna
źródło
W tym wątku są nieprawidłowe informacje. Skopiowałem i wkleiłem nieprawidłowe informacje:
Powyższe jest NIEPRAWIDŁOWE !!!!! To jest odwrócone. Sposób, w jaki ustaliłem, że jest nieprawidłowy, pochodzi z następującej książki:
Oracle OCP Wprowadzenie do Oracle 9i: Przewodnik po egzaminach SQL . Page 115 Tabela 3-1 zawiera dobre podsumowanie na ten temat. Nie mogłem zrozumieć, dlaczego mój przekonwertowany SQL nie działa poprawnie, dopóki nie poszedłem do starej szkoły i nie spojrzałem na drukowaną książkę!
Oto podsumowanie tej książki, skopiowane wiersz po wierszu:
Składnia sprzężenia zewnętrznego Oracle:
Odpowiednik ANSI / ISO:
Zauważ tutaj, że jest to odwrotność tego, co napisano powyżej. Przypuszczam, że ta książka może mieć erratę, jednak ufam tej książce bardziej niż temu, co jest w tym wątku. To przewodnik po egzaminach na głośny płacz ...
źródło
a.col_1(+) = b.col_1
dopasowania RIGHT JOIN, a nie LEFT JOIN.