Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

JOIN

Termin Definicja
JOIN

JOIN to operator Transact-SQL łączący wiersze z dwóch lub więcej tabel na podstawie zdefiniowanego warunku.

JOIN w Transact-SQL i warunek łączenia tabel

JOIN w języku Transact-SQL służy do zestawiania wierszy pochodzących z dwóch lub większej liczby tabel na podstawie warunku określonego po słowie ON. W Microsoft SQL Server operator ten nie kopiuje mechanicznie całych tabel, lecz tworzy wynikowe wiersze z kolumn wskazanych w klauzuli SELECT. Najczęściej warunek łączenia porównuje klucz główny jednej tabeli z kluczem obcym drugiej, na przykład klienci.ID = zamowienia.KlientID. Alias tabeli, zapisany po jej nazwie, ułatwia odczyt zapytania i pozwala jednoznacznie wskazywać kolumny o takich samych nazwach.

Podstawową postacią jest INNER JOIN. Zwraca on wyłącznie te wiersze, dla których warunek z klauzuli ON jest spełniony po obu stronach. Jeżeli klient nie ma żadnego zamówienia, nie pojawi się w wyniku połączenia wewnętrznego tabel klientów i zamówień. W praktyce oznacza to, że rodzaj JOIN-a określa także, jakie brakujące powiązania zostaną odrzucone. Warunek powinien odnosić się do właściwych kolumn relacyjnych; połączenie tabel bez odpowiedniego kryterium może zwrócić niezamierzoną liczbę kombinacji.

INNER, LEFT, RIGHT i FULL JOIN w SQL Server

LEFT OUTER JOIN, często zapisywany skrótowo jako LEFT JOIN, zachowuje wszystkie wiersze z tabeli znajdującej się po lewej stronie. Jeżeli po prawej stronie nie istnieje pasujący rekord, kolumny tej prawej tabeli otrzymują wartość NULL. Dzięki temu można wyszukać na przykład urządzenia, które nie mają przypisanego zgłoszenia serwisowego. RIGHT JOIN działa analogicznie, ale zachowuje wszystkie wiersze tabeli prawej. W czytelnych zapytaniach częściej przekształca się go na odpowiedni LEFT JOIN przez zmianę kolejności tabel.

FULL OUTER JOIN zwraca zarówno pasujące pary, jak i niepasujące wiersze z obu tabel. Brak danych po jednej stronie jest wtedy reprezentowany przez NULL. Ten wariant może służyć do porównywania dwóch zbiorów, gdy trzeba wykazać rekordy występujące tylko w pierwszej tabeli, tylko w drugiej albo w obu. SQL Server obsługuje również CROSS JOIN, który tworzy iloczyn kartezjański: każdy wiersz pierwszej tabeli jest łączony z każdym wierszem drugiej. Bez ograniczenia liczby rekordów taki wynik może bardzo szybko urosnąć, dlatego ta forma wymaga świadomego zastosowania.

NULL, wielokrotne dopasowania i zakres wyniku

W Transact-SQL porównanie wartości NULL za pomocą operatora równości nie daje wyniku prawda. NULL oznacza brak lub nieznaną wartość, dlatego rekordy z pustym kluczem nie zostaną połączone warunkiem tabelaA.Klucz = tabelaB.Klucz. Do sprawdzania braku wartości używa się osobno IS NULL albo IS NOT NULL. Należy także rozróżniać NULL od pustego tekstu, zera oraz wartości domyślnej, ponieważ SQL Server traktuje te wartości jako różne dane.

Jeżeli jedna wartość klucza z tabeli nadrzędnej występuje wiele razy w tabeli podrzędnej, JOIN zwróci osobny wiersz dla każdego dopasowania. Jest to prawidłowe zachowanie relacji jeden-do-wielu, ale może prowadzić do pozornie zduplikowanych danych, gdy w SELECT pokazane są tylko kolumny tabeli nadrzędnej. Samo dodanie DISTINCT usuwa identyczne wiersze wynikowe, lecz nie naprawia błędnie zdefiniowanego warunku. Przed zastosowaniem agregacji, takiej jak COUNT lub SUM, trzeba ustalić, czy łączenie nie zwielokrotnia wierszy wpływających na obliczenie.

Plan wykonania i kontrola zapytania JOIN

Wydajność JOIN-a w SQL Server zależy między innymi od liczby przetwarzanych wierszy, selektywności warunku, typów danych oraz dostępnych indeksów. Optymalizator może wybrać między innymi zagnieżdżone pętle, łączenie przez sortowanie i scalanie albo łączenie haszujące. Plan wykonania pokazuje, jak silnik zamierza odczytać i połączyć dane, ale plan nie zastępuje sprawdzenia rzeczywistych statystyk wykonania. Przy analizie problemu warto porównać szacowaną i faktyczną liczbę wierszy oraz sprawdzić, czy filtr nie został zastosowany dopiero po przetworzeniu dużego zbioru.

Diagnostykę zapytania można rozpocząć od włączenia statystyk wejścia i czasu poleceniami SET STATISTICS IO ON oraz SET STATISTICS TIME ON, a następnie odczytania komunikatów po wykonaniu zapytania w SQL Server Management Studio. Indeks na kolumnach używanych w warunku JOIN może ograniczyć liczbę odczytów, lecz jego przydatność zależy od konkretnego zapytania i rozkładu wartości. Należy też unikać łączenia kolumn o niezgodnych typach danych, ponieważ niejawna konwersja może zwiększyć koszt operacji albo zmienić sposób wykorzystania indeksu. W przypadku nieoczekiwanego wyniku trzeba kolejno sprawdzić klucze, warunek ON, filtry w WHERE oraz liczbę dopasowań po obu stronach relacji.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę