Bardziej jak skorelowane podzapytanie
LATERAL
Przyłączenia (Postgresa 9,3 lub później) jest większa jak skorelowanej podzapytaniu , a nie gładkie podzapytanie. Jak zauważył Andomar , funkcja lub podzapytanie po prawej stronie LATERAL
sprzężenia musi być ocenione raz dla każdego wiersza po lewej stronie - podobnie jak podzapytanie skorelowane - podczas gdy zwykłe podzapytanie (wyrażenie tabeli) jest oceniane tylko raz . (Planer zapytań ma jednak sposoby na optymalizację wydajności w obu przypadkach).
Ta pokrewna odpowiedź zawiera przykłady kodu dla obu stron, które rozwiązują ten sam problem:
Dla powracających więcej niż jedną kolumnę , o LATERAL
przyłączenia jest zwykle prostsze, czystsze i szybsze.
Pamiętaj też, że odpowiednikiem skorelowanego podzapytania jest LEFT JOIN LATERAL ... ON true
:
Przeczytaj instrukcję dalej LATERAL
Jest bardziej autorytatywny niż cokolwiek, co zamieścimy tutaj w odpowiedziach:
Rzeczy, których podzapytanie nie może zrobić
Tam są rzeczy, które LATERAL
łączą może zrobić, ale (skorelowane) podzapytanie nie może (łatwo). Skorelowane podzapytanie może zwracać tylko jedną wartość, a nie wiele kolumn i wiele wierszy - z wyjątkiem samych wywołań funkcji (które mnożą wiersze wynikowe, jeśli zwracają wiele wierszy). Ale nawet niektóre funkcje zwracające zbiory są dozwolone tylko w FROM
klauzuli. Podobnie jak w unnest()
przypadku wielu parametrów w Postgres 9.4 lub nowszym. Instrukcja:
Jest to dozwolone tylko w FROM
klauzuli;
Więc to działa, ale nie można go łatwo zastąpić podzapytaniem:
CREATE TABLE tbl (a1 int[], a2 int[]);
SELECT * FROM tbl, unnest(a1, a2) u(elem1, elem2); -- implicit LATERAL
Przecinek ( ,
) w FROM
klauzuli jest krótką notacją dla CROSS JOIN
.
LATERAL
jest przyjmowany automatycznie dla funkcji tabelarycznych.
Więcej o szczególnym przypadku UNNEST( array_expression [, ... ] )
:
Funkcje zwracające zestaw na SELECT
liście
Możesz również bezpośrednio użyć funkcji zwracających zestaw, takich jak unnest()
na SELECT
liście. Kiedyś wykazywało zaskakujące zachowanie z więcej niż jedną taką funkcją na tej samej SELECT
liście aż do Postgres 9.6. Ale w końcu został oczyszczony za pomocą Postgres 10 i jest teraz ważną alternatywą (nawet jeśli nie jest to standardowy SQL). Widzieć:
Opierając się na powyższym przykładzie:
SELECT *, unnest(a1) AS elem1, unnest(a2) AS elem2
FROM tbl;
Porównanie:
dbfiddle dla strony 9.6 tutaj
dbfiddle dla strony 10 tutaj
Wyjaśnij błędne informacje
Instrukcja:
Dla INNER
i OUTER
łączą typów sprzężenia warunek musi być określony, a mianowicie dokładnie jedną NATURAL
, ON
join_condition lub USING
( join_column [...]). Zobacz poniżej znaczenie.
Ponieważ CROSS JOIN
żadna z tych klauzul nie może się pojawić.
Więc te dwa zapytania są prawidłowe (nawet jeśli nie są szczególnie przydatne):
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t ON TRUE;
SELECT *
FROM tbl t, LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
Chociaż ten nie jest:
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
Dlatego przykład kodu @ Andomar jest poprawny ( CROSS JOIN
nie wymaga warunku łączenia), a kod @ Attila jest nieprawidłowy.
apply
jest taki sam jak wlateral
standardzie SQL)