środa, 7 czerwca 2017

Lekcja 21. Złączenia zewnętrzne

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