Złączenie zewnętrzne (ang. outer join) pobiera wiersz,
nawet jeżeli jedna z jego wartości zawiera wartość NULL. W SQL/92 składania złączeń zewnętrznych wygląda następująco:
gdzie:
- tabela1 i tabela2 są tabelami, które chcemy złączyć
- LEFT oznacza, że chcemy wykonać złączenie lewostronne
- RIGHT oznacza, że chcemy wykonać złączenie prawostronne
- FULL oznacza, że chcemy wykonać pełne złączenie zewnętrzne, które wykorzystuje wszystkie wiersze z tabela1 i tabela2, łącznie z tymi posiadającymi wartość NULL w kolumnach używanych w złączeniu
Aby zrozumieć różnicę między ww. złączeniami
zewnętrznymi, rozważmy następujący przykład. Załóżmy, że chcemy uzyskać
informację o tym, kto jest kierownikiem danego działu. W tym celu należy złączyć
tabele department oraz employee i pobrać kolumny department.dept_no i department.department oraz kolumny employee.first_name i employee.last_name.
W zapytaniu użyto złączenia wewnętrznego INNER JOIN,
podając w klauzuli ON warunek department.mngr_no
= employee.emp_no.
Powyższe zapytanie zwróciło 17 rekordów.
Jednakże w tabeli department
znajduje się 21 rekordów.
Przyjrzyjmy się zatem zawartości tej tabeli.
Możemy zauważyć, że 4 rekordy w kolumnie mngr_no mają wartość NULL. Z ostatniej lekcji (Lekcja 20. Złączenia wewnętrzne.) można było
dowiedzieć się, że złączenia wewnętrzne zwracają wiersz tylko wtedy, gdy kolumny w
złączeniu spełniają warunek złączenia. To oznacza, że jeżeli wiersz w jednej
kolumn w warunku złączenia posiada wartość NULL,
nie zostanie on zwrócony. Taka sytuacja
zaszła w naszym przypadku i dlatego też działy o numerach 116, 180,
620 oraz 621 nie zostały zwrócone w wynikach zapytania.
Jednakże naszym celem jest pobranie informacji na
temat wszystkich działów. Teraz już wiemy, że poprawne zapytanie powinno
zwrócić 21 rekordów, na które składa się 17 działów mających kierownika oraz 4
działy nie posiadające swojego kierownika. Ten rezultat możemy osiągnąć poprzez
zastosowanie złączenia zewnętrznego.
Przykład
lewostronnego złączenia zewnętrznego
Złączenie typu LEFT OUTER JOIN pozwala nam na
uwzględnienie w wyniku danych, które nie posiadają swoich odpowiedników w
złączanych tabelach. Oznacza to, że jeśli w pierwszej tabeli pojawiają się
wiersze, które nie posiadają odpowiedników w drugiej tabeli to zostaną one wzięte
pod uwagę podczas złączenia, ale puste kolumny zostaną wypełnione wartościami NULL.
W poniższym zapytaniu wykorzystano lewostronne
złączenie zewnętrzne w celu pobrania informację o tym, kto jest kierownikiem
danego działu. Jeśli jakiś dział nie ma kierownika to w kolumnie MANAGER zostanie zwrócona wartość NULL.
Przykład prawostronnego
złączenia zewnętrznego
Złączenie typu RIGHT
OUTER JOIN działa analogicznie do LEFT OUTER JOIN ale w tabeli wynikowej
uwzględnia wiersze z drugiej tabeli, które nie posiadają odpowiedników w
pierwszej.
Załóżmy tym razem, że chcemy uzyskać informację czy
dany pracownik jest kierownikiem jakiegoś działu. W tym celu należy złączyć
tabele department oraz employee i pobrać kolumny department.dept_no i department.department oraz kolumny employee.first_name i employee.last_name.
W poniższym zapytaniu wykorzystano prawostronne
złączenie zewnętrzne w celu pobrania informacji czy dany pracownik jest
kierownikiem jakiegoś działu.. Jeśli pracownik nie jest kierownikiem żadnego działu
to w kolumnach DEPT_NO oraz DEPARTMENT zostaną zwrócone wartości NULL.
Przykład pełnego
złączenia zewnętrznego
Złączenie
obustronne jest w pewnym sensie sumą złączenia lewostronnego i prawostronnego.
Zawiera wszystkie wiersze obu złączonych tabel, w tym te które nie mają swoich
odpowiedników.
W poniższym zapytaniu wykorzystano pełne złączenie
zewnętrzne do pobrania informacji czy dany pracownik jest kierownikiem jakiegoś
działu oraz czy dany dział ma jakiegoś kierownika. Jeśli pracownik nie jest
kierownikiem żadnego działu to w kolumnach DEPT_NO
oraz DEPARTMENT zostaną zwrócone
wartości NULL, natomiast jeżeli jakiś
dział nie ma kierownika to w kolumnie MANAGER
zostanie zwrócona wartość NULL. Nie
jest to przykład zbyt praktyczny, jednakże ma na celu przestawienie działania
pełnego złączenia zewnętrznego.
Brak komentarzy:
Prześlij komentarz