0Pricing
SQL Academy · Lekcja

Złączenia lateralne (LATERAL JOIN)

Odwołuj się do poprzedniego elementu FROM wewnątrz podzapytania za pomocą LATERAL — to odpowiednik wywołania funkcji dla każdego wiersza w SQL.

Złączenia lateralne (LATERAL JOIN) to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest LATERAL?

LATERAL pozwala podzapytaniu w klauzuli FROM odwoływać się do kolumn elementów znajdujących się wcześniej na liście FROM. Bez LATERAL elementy FROM nie mogą wzajemnie się odczytywać.

Model mentalny

LATERAL oznacza: „dla każdego wiersza lewej strony wykonaj to zapytanie”. Przypomina podzapytanie skorelowane, ale znajduje się w klauzuli FROM i może zwracać wiele wierszy oraz kolumn.

3 najlepsze zamówienia na użytkownika

Klasyczne zastosowanie LATERAL:

SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
  SELECT id, total FROM orders
  WHERE user_id = u.id
  ORDER BY total DESC
  LIMIT 3
) AS o ON true;

Dlaczego nie podzapytanie w SELECT?

Skalarne podzapytanie w SELECT zwraca jedną wartość. LATERAL zwraca wiele wierszy i wiele kolumn dla każdego wiersza zewnętrznego.

LATERAL z funkcjami

Funkcje zwracające zbiory domyślnie zachowują się podobnie do LATERAL:

SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;

-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;

LATERAL a funkcje okna

W przypadku „top-N na grupę” można użyć zarówno LATERAL, jak i ROW_NUMBER. ROW_NUMBER jest często wydajniejsze, ponieważ przechodzi przez tabelę raz; LATERAL wykonuje zapytanie ponownie dla każdego wiersza zewnętrznego.

-- ROW_NUMBER alternative:
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
  FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;

LATERAL z agregatami

Wartości obliczone wcześniej dla każdego wiersza:

SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
  SELECT MAX(created_at) AS last_order_at,
         COUNT(*)        AS total_orders
  FROM orders WHERE user_id = u.id
) AS stats ON true;

ON true

LATERAL wymaga klauzuli ON w przypadku JOIN — ale warunek łączenia znajduje się wewnątrz podzapytania, dlatego zewnętrzna klauzula ON ma wartość true.

CROSS JOIN LATERAL a LEFT JOIN LATERAL

  • CROSS JOIN LATERAL — wiersz zewnętrzny jest odrzucany, jeśli zapytanie wewnętrzne nie zwróci żadnych wierszy
  • LEFT JOIN LATERAL ... ON true — wiersz zewnętrzny pozostaje, a kolumny przyjmują wartości NULL

LATERAL w zapytaniach o odległość

Najbliższy sklep dla każdego użytkownika:

SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
  SELECT name, location <-> u.location AS distance
  FROM stores
  ORDER BY location <-> u.location
  LIMIT 1
) AS s;

LATERAL jest standardem SQL

Ustandaryzowano go w SQL:1999. PostgreSQL implementuje go jako LATERAL; SQL Server używa CROSS APPLY / OUTER APPLY.

Wydajność

LATERAL wykonuje zapytanie osobno dla każdego wiersza zewnętrznego. Przy odpowiednim indeksie w tabeli wewnętrznej każda iteracja jest szybka. Bez takiego indeksu rozwiązanie może być powolne przy dużej skali.

Podsumowanie

LATERAL = „podzapytanie w FROM, które widzi wiersz zewnętrzny”.

  • Top-N na grupę
  • Wstępne obliczenia dla każdego wiersza
  • Funkcje zwracające zbiory
  • Połączenie z LEFT JOIN ... ON true w przypadku złączeń zewnętrznych

Szybkie sprawdzenie

Na co pozwala LATERAL, na co nie pozwala zwykłe podzapytanie w FROM?

Często zadawane pytania

Czy lekcja „Złączenia lateralne (LATERAL JOIN)” jest bezpłatna?

Tak — pełny tekst „Złączenia lateralne (LATERAL JOIN)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Złączenia lateralne (LATERAL JOIN)”?

Odwołuj się do poprzedniego elementu FROM wewnątrz podzapytania za pomocą LATERAL — to odpowiednik wywołania funkcji dla każdego wiersza w SQL. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Złączenia lateralne (LATERAL JOIN)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Złączenia krzyżowe i iloczyny kartezjańskie
  2. Złączenia lateralne (LATERAL JOIN)
  3. Antyzłączenia i semizłączenia (NOT EXISTS)
  4. Dostrajanie wydajności złączeń wielu tabel
← Powrót do SQL Academy