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

Łączenie danych z NULL (zachowanie w LEFT/RIGHT JOIN)

Termin Definicja
Łączenie danych z NULL (zachowanie w LEFT/RIGHT JOIN)

Przy złączeniach LEFT i RIGHT brak dopasowania daje wartości NULL po stronie tabeli opcjonalnej — warunki filtrujące trzeba wtedy umieszczać w klauzuli ON, nie WHERE.

Łączenie danych z NULL — definicja i znaczenie w LEFT oraz RIGHT JOIN

Łączenie danych z wartością NULL dotyczy sytuacji, w której podczas zestawiania rekordów z dwóch tabel nie istnieje odpowiadający wiersz po jednej ze stron. W języku SQL NULL nie oznacza zwykłego tekstu, zera ani pustego ciągu znaków. Jest oznaczeniem braku znanej wartości, dlatego porównanie NULL = NULL nie daje wyniku prawdziwego. Z tego powodu rekordy zawierające NULL w kolumnie używanej do łączenia nie dopasują się automatycznie do innych rekordów również zawierających NULL.

W przypadku LEFT JOIN zachowywane są wszystkie wiersze z tabeli znajdującej się po lewej stronie instrukcji. Jeżeli dla danego wiersza nie zostanie znaleziony pasujący rekord w tabeli prawej, kolumny pochodzące z tej tabeli zostaną uzupełnione wartością NULL. Przy RIGHT JOIN analogiczna zasada działa w odwrotnym kierunku: zachowywane są wszystkie rekordy tabeli prawej, a brak dopasowania po stronie lewej jest przedstawiany jako NULL.

Przykładowo, po połączeniu tabeli klientów z tabelą zgłoszeń można otrzymać również tych klientów, którzy nie mają jeszcze żadnego zgłoszenia. Dane klienta będą wtedy dostępne, natomiast pola opisujące zgłoszenie przyjmą wartość NULL. Taki rezultat nie oznacza błędu w samym złączeniu. Jest informacją, że rekord nadrzędny istnieje, lecz po drugiej stronie nie znaleziono odpowiadających danych.

Różnica między warunkiem ON a filtrowaniem w WHERE

Najważniejsze znaczenie przy pracy z brakującymi dopasowaniami ma miejsce, w którym umieszczony zostanie warunek. Klauzula ON określa, które rekordy mają zostać połączone, natomiast WHERE filtruje wynik powstały po wykonaniu złączenia. W LEFT JOIN warunek odnoszący się do tabeli opcjonalnej umieszczony w WHERE może usunąć wiersze, dla których pojawił się NULL. W praktyce takie zapytanie zaczyna zachowywać się podobnie do INNER JOIN, mimo że formalnie nadal używa LEFT JOIN.

Rozważmy zapytanie:

SELECT k.id, k.nazwa, z.status
FROM klienci AS k
LEFT JOIN zgloszenia AS z
  ON z.klient_id = k.id
WHERE z.status = 'otwarte';

Klienci bez zgłoszenia mają w kolumnie z.status wartość NULL, a warunek w WHERE nie jest dla nich spełniony. Zostaną więc odrzuceni. Jeżeli celem jest zachowanie wszystkich klientów i dołączenie wyłącznie otwartych zgłoszeń, warunek powinien znaleźć się w klauzuli ON:

SELECT k.id, k.nazwa, z.status
FROM klienci AS k
LEFT JOIN zgloszenia AS z
  ON z.klient_id = k.id
 AND z.status = 'otwarte';

W tym wariancie klient bez otwartego zgłoszenia pozostaje w rezultacie, a pola tabeli zgloszenia otrzymują NULL. Podobnie należy świadomie traktować warunki dotyczące dat, kategorii, aktywności rekordu czy zakresu wartości. Przeniesienie warunku między ON i WHERE nie jest wyłącznie zmianą zapisu, ponieważ może zmienić liczbę oraz znaczenie zwracanych wierszy.

Warto również pamiętać, że operatorów = i <> nie stosuje się do bezpośredniego sprawdzania braku wartości. Do tego celu służą wyrażenia IS NULL oraz IS NOT NULL:

SELECT k.id, k.nazwa
FROM klienci AS k
LEFT JOIN zgloszenia AS z
  ON z.klient_id = k.id
WHERE z.id IS NULL;

Takie zapytanie może służyć do znalezienia klientów, dla których nie istnieje żadne powiązane zgłoszenie. Warunek sprawdza brak wartości po stronie dołączanej tabeli, a nie próbuje porównywać dwóch nieokreślonych wartości.

Typowe problemy i błędy przy obsłudze NULL

Jednym z częstych błędów jest oczekiwanie, że NULL zachowa się jak pusta komórka albo konkretny tekst. Funkcje agregujące, działania arytmetyczne i wyrażenia logiczne mogą reagować na NULL w odmienny sposób. Na przykład COUNT(kolumna) zwykle pomija wartości NULL, natomiast COUNT(*) zlicza wiersze niezależnie od zawartości kolumn. Różnica ta może prowadzić do innych wyników w raportach podsumowujących dane po złączeniu.

Problem pojawia się także wtedy, gdy po LEFT JOIN zostanie użyty warunek w rodzaju WHERE z.typ <> 'zamknięte'. Rekordy bez dopasowania mają z.typ IS NULL, więc nie spełniają tego warunku i znikają z wyniku. Jeżeli mają pozostać widoczne, trzeba jawnie uwzględnić brak wartości, na przykład przez:

WHERE z.typ <> 'zamknięte'
   OR z.typ IS NULL;

Inną przyczyną nieoczekiwanych rezultatów jest łączenie po kolumnach, w których część wartości jest pusta lub niejednoznaczna. Gdy klucz po jednej stronie ma NULL, standardowe złączenie nie uzna go za równy kluczowi z wartością NULL po drugiej stronie. Jeśli logika aplikacji wymaga potraktowania dwóch braków jako wspólnego stanu, należy zapisać to jawnie, z uwzględnieniem możliwości używanego systemu bazodanowego. W niektórych środowiskach można wykorzystać funkcję zastępującą NULL wartością techniczną, ale takie rozwiązanie powinno być dobrane ostrożnie, aby nie pomylić braku danych z rzeczywistą wartością.

Warto kontrolować również zwielokrotnienie rekordów. Jeżeli jeden klient ma kilka powiązanych zgłoszeń, LEFT JOIN zwróci klienta w kilku wierszach. Nie jest to skutek samego NULL, lecz relacji jeden-do-wielu. Dodanie DISTINCT może ukryć objaw, ale nie zawsze rozwiązuje problem logiczny. Często właściwsze jest użycie agregacji, podzapytania, funkcji okna albo wcześniejsze ograniczenie danych do jednego właściwego rekordu.

Do diagnostyki takich zapytań przydatne jest porównanie kilku wersji: samego złączenia, z warunkiem w ON, z warunkiem w WHERE oraz z jawnym IS NULL. Należy sprawdzić, czy liczba wierszy jest zgodna z oczekiwaną relacją między tabelami, czy brak dopasowania jest zamierzony i czy pola uzupełnione przez NULL są później prawidłowo interpretowane przez raport lub aplikację.

W jakich sytuacjach warto poprosić o ocenę stanu sprzętu - Łączenie danych z NULL (zachowanie w LEFT/RIGHT JOIN)

Do serwisu warto zgłosić się wtedy, gdy problem z zapytaniem jest objawem szerszej awarii komputera, uszkodzenia nośnika danych, niestabilnego działania systemu albo utraty dostępu do plików potrzebnych do pracy z bazą. Szczególnej ostrożności wymagają sytuacje, w których błędne wyniki pojawiły się po nagłym wyłączeniu urządzenia, problemach z dyskiem, aktualizacji oprogramowania lub uszkodzeniu profilu użytkownika. Przed działaniami naprawczymi zaleca się zabezpieczenie kopii danych oraz unikanie nadpisywania plików źródłowych.

W Warszawskim Pogotowiu Komputerowym 24/7 można przekazać do sprawdzenia laptop lub komputer PC, gdy analiza zapytania jest utrudniona przez problemy sprzętowe albo systemowe. W zgłoszeniu warto opisać, czy występuje brak danych po jednej stronie złączenia, znikanie rekordów po dodaniu WHERE, powielanie wierszy lub błędy odczytu plików. Takie informacje pomagają odróżnić błąd konstrukcji SQL od problemu z działaniem środowiska, w którym zapytanie jest wykonywane.

Zgłoszenie jest uzasadnione również wtedy, gdy nie można bezpiecznie wykonać kopii zapasowej, baza działa niestabilnie albo każda próba otwarcia danych kończy się komunikatem o błędzie. Najpierw powinno zostać ustalone, czy problem dotyczy logiki NULL i warunków złączenia, czy też występuje uszkodzenie systemu plików, konfiguracji programu lub samego urządzenia. Dopiero po takim rozdzieleniu przyczyn można dobrać bezpieczne dalsze działania.

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