Rozważmy następujący przykład. Mamy dwie tabele, DEPARTAMENTY i PRACOWNICY.
Niektóre działy nie mają jeszcze pracowników.
To zapytanie wykorzystuje sprzężenie wewnętrzne, które znajdzie pracownika działu 999 pracuje w, jeśli w ogóle, w przeciwnym razie nie pokazuje nic (nawet pracownika lub jego nazwa):
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
join employees b
on a.department_id = b.department_id
where b.employee_id = '999'
Następny kwerendy używa łączenie zewnętrzne (po lewej stronie między działami i pracownikami) i znajduje dział, w którym pracuje 999 pracownik. Jednak również nie będzie pokazywał identyfikatora pracownika ani jego nazwiska, jeśli nie działają oni w żadnym departamencie. Wynika to z faktu, że zewnętrzna połączona tabela jest używana w klauzuli WHERE. Jeśli nie ma odpowiedniego działu, będzie to wartość pusta (nie 999, mimo że 999 istnieje w przypadku pracowników).
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
left join employees b
on a.department_id = b.department_id
where b.employee_id = '999'
ale za to zapytanie:
select a.department_id, a.department_desc, b.employee_id, b.employee_name
from departments a
left join employees b
on a.department_id = b.department_id
and b.employee_id= '999'
Teraz kryteriów jest w sprawie klauzuli. Więc nawet jeśli ten pracownik pracuje w żadnym departamencie, nadal będzie zwrócony (jego identyfikator i imię). Kolumny działu będą miały wartość null, ale otrzymamy wynik (strona pracownika).
Można by pomyśleć, że nigdy nie będziesz chciał używać zewnętrznego połączonego stołu w klauzuli WHERE, ale niekoniecznie tak jest. Zwykle jest tak z przyczyn opisanych powyżej.
Załóżmy, że chcesz wszystkie działy bez pracowników. Następnie można wykonać następujące czynności, które wykonuje użyć sprzężenia zewnętrznego, a zewnętrzna dołączył tabela jest używana w klauzuli WHERE:
select a.department_id, a.department_desc, b.employee_id
from departments a
left join employees b
on a.department_id = b.department_id
where b.employee_id is null
^^ Pokazuje działów bez pracowników.
Powyższy tekst jest prawdopodobnie jedynym słusznym powodem, dla którego chciałbyś użyć tabeli połączonej zewnętrznie w klauzuli WHERE zamiast klauzuli ON (co, jak sądzę, jest twoim pytaniem, różnica między złączeniami wewnętrznym i zewnętrznym jest całkowicie inny temat).
Dobrym sposobem na sprawdzenie jest: Używasz zewnętrznych połączeń, aby zezwalać na wartości zerowe. Dlaczego miałbyś użyć zewnętrznego sprzężenia i powiedzieć, że pole nie powinno być puste i powinno być równe "XYZ"? Jeśli wartość musi mieć wartość "XYZ" (nie ma wartości null), to dlaczego należy nakazać bazie danych zezwolenie na wycofanie wartości null? To tak, jakby powiedzieć jedną rzecz, a później ją przesłonić.
Lepiej? Służą one do innego celu. JOIN jest złączeniem wewnętrznym, LEFT JOIN jest złączem zewnętrznym (to samo co LEFT OUTER JOIN). W zależności od twoich intencji użyjesz sprzężenia zewnętrznego lub wewnętrznego. Klauzuli WHERE nie należy używać do warunków łączenia. Należy go stosować do innych kryteriów; to znaczy. filtracja. –
Przeczytałem tam odpowiedź jako "Ponieważ LEWY DOŁĄCZ (z WHERE) jest * efektywnie * INNER JOIN, użyj zamiast tego INNER JOIN". Nie jestem pewien, jak "mylące" jest dla [konkretnego] programu do planowania zapytań, ale jest on mniejszy niż idealny dla człowieka [czytaj: moje] zużycie, IMOHO. (To samo można powiedzieć o użyciu CROSS JOIN, gdy wystarczą INNER, np.) – user2864740
Lewe sprzężenie z klauzulą where, KTÓRA UŻYWA TABELĘ POŁĄCZONĄ ZEWNĘTRZNIE, jest faktycznie połączeniem wewnętrznym. Jednak jeśli klauzula where nie używa zewnętrznego połączonego stołu, nie, to nieprawda. –