Łączenie tabel i widoków to zapytanie zestawiające dane fizyczne z wynikami zdefiniowanych wcześniej perspektyw.
Jak zapytanie łączy tabelę z widokiem
Łączenie tabel i widoków polega na użyciu instrukcji SQL, w której tabela przechowuje dane wierszowe, a widok udostępnia wynik wcześniej zdefiniowanego zapytania. Widok nie musi zawierać własnej, niezależnej kopii danych. W typowym przypadku jest logiczną definicją obejmującą instrukcję SELECT, dlatego podczas wykonania zapytania silnik bazy danych rozwija definicję widoku i analizuje ją razem z pozostałymi elementami polecenia. Wynik można następnie połączyć z tabelą na podstawie wspólnej kolumny, klucza głównego, klucza obcego albo innego warunku porównania.
Najczęściej stosuje się składnię JOIN z klauzulą ON. Przykładowo tabela przechowująca klientów może zostać połączona z widokiem zawierającym podsumowanie ich zamówień. Warunek łączenia może porównywać identyfikator klienta w tabeli z identyfikatorem klienta zwracanym przez widok. Nadanie tabeli i widokowi aliasów ułatwia odczyt zapytania, zwłaszcza gdy oba źródła zawierają kolumny o takich samych nazwach. Sam widok jest źródłem wierszy dla zapytania nadrzędnego, podobnie jak tabela, ale jego wynik zależy od definicji oraz danych dostępnych w tabelach bazowych.
Rodzaje JOIN i zachowanie niepasujących wierszy
INNER JOIN zwraca wyłącznie te wiersze, dla których warunek łączenia jest spełniony po obu stronach. Jest właściwy wtedy, gdy wynik ma obejmować tylko rekordy posiadające odpowiadające sobie dane w tabeli i widoku. LEFT JOIN zachowuje wszystkie wiersze z lewej strony, a gdy widok nie dostarczy dopasowania, kolumny pochodzące z widoku otrzymują wartość NULL. Odwrócenie kolejności źródeł i użycie RIGHT JOIN daje analogiczny efekt dla prawej strony, chociaż wiele zapytań zapisuje się czytelniej po prostu jako LEFT JOIN.
FULL OUTER JOIN, dostępny w wybranych silnikach baz danych, zachowuje niepasujące wiersze z obu źródeł. Trzeba odróżnić warunek w klauzuli ON od filtrów umieszczonych w WHERE. Filtr dotyczący kolumny widoku zapisany w WHERE może usunąć wiersze z wartościami NULL i w praktyce zmienić rezultat oczekiwany po użyciu LEFT JOIN w zachowanie podobne do INNER JOIN. Przy porównywaniu wartości NULL obowiązuje logika trójwartościowa SQL, dlatego wartość pusta nie jest równa innej wartości pustej za pomocą zwykłego operatora =.
Duplikaty, agregacja i jednoznaczność wyniku
Połączenie nie gwarantuje, że jeden wiersz tabeli odpowie dokładnie jednemu wierszowi widoku. Jeżeli po stronie widoku znajduje się kilka rekordów spełniających warunek, pojedynczy wiersz tabeli zostanie powtórzony dla każdego dopasowania. Jest to prawidłowe działanie złączenia, ale może prowadzić do zawyżenia liczby rekordów albo sum, gdy zapytanie nie uwzględnia relacji jeden-do-wielu. Klauzula DISTINCT usuwa identyczne wiersze z końcowego wyniku, lecz nie naprawia błędnie zaprojektowanego warunku łączenia i nie zawsze eliminuje powtórzenia różniące się choćby jedną kolumną.
Widok może już wykonywać grupowanie za pomocą GROUP BY oraz obliczać wartości funkcjami agregującymi, takimi jak COUNT, SUM lub MAX. Połączenie tabeli z takim widokiem powinno wykorzystywać kolumny, które jednoznacznie identyfikują poziom agregacji. Jeżeli widok zwraca podsumowanie dla klienta, łączenie po samym identyfikatorze klienta jest logicznie inne niż łączenie po identyfikatorze klienta i okresie rozliczeniowym. Przed użyciem wyniku trzeba sprawdzić, czy wartości kluczy są unikatowe, czy typy danych są zgodne oraz czy filtr nie zmienia liczności wierszy.
Wydajność i sprawdzanie planu wykonania
Silnik bazy danych może przekształcić zapytanie obejmujące widok i tabelę, a następnie wybrać plan wykonania z użyciem dostępnych indeksów, sortowania, skanowania albo algorytmu złączenia. W definicji widoku warto ograniczać zbędne kolumny i unikać niepotrzebnego przetwarzania, ale ostateczna wydajność zależy także od zapytania nadrzędnego, statystyk oraz struktury tabel. Indeks na kolumnie używanej w warunku JOIN może ograniczyć liczbę odczytywanych danych, jednak nie gwarantuje poprawy w każdej sytuacji. Znaczenie mają również selektywność filtrów, liczba wierszy oraz koszt operacji wykonywanych wewnątrz widoku.
Przy nieoczekiwanym wyniku należy najpierw uruchomić osobno zapytanie definiujące widok, następnie sprawdzić liczbę i unikatowość kluczy, a dopiero później analizować pełne złączenie. Pomocne jest porównanie rezultatów dla INNER JOIN i LEFT JOIN oraz obejrzenie planu wykonania udostępnianego przez konkretny silnik bazy danych. Diagnostyka laptopa lub komputera może obejmować problemy z lokalnym środowiskiem bazodanowym, sterownikiem, konfiguracją połączenia i narzędziem uruchamiającym zapytanie, natomiast sama semantyka złączenia wynika z instrukcji SQL, definicji widoku oraz danych.