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
- Złączenia krzyżowe i iloczyny kartezjańskie
- Złączenia lateralne (LATERAL JOIN)
- Antyzłączenia i semizłączenia (NOT EXISTS)
- Dostrajanie wydajności złączeń wielu tabel