Co to LATERAL
dołączyć?
Ta funkcja została wprowadzona w PostgreSQL 9.3. Instrukcja:
Podzapytania pojawiające się w FROM
może być poprzedzony słowem kluczowymLATERAL
. Dzięki temu mogą odwoływać się do kolumn dostarczonych przez poprzedzający FROM
rzeczy. (Bez LATERAL
, każde podzapytanie jest oceniane niezależnie, więc nie może odwoływać się do żadnego innego FROM
pozycja.)
Funkcje tabeli pojawiające się w FROM
może być również poprzedzony słowem kluczowym LATERAL
, ale dla funkcji słowo kluczowe jest opcjonalne; argumenty funkcji mogą zawierać odwołania do kolumn podanych przez poprzedzoną FROM
przedmioty w każdym przypadku.
Podano tam podstawowe przykłady kodu.
Bardziej jak skorelowany podzapytanie
LATERAL
join jest bardziej jak skorelowane podzapytanie, a nie zwykłe podzapytanie, w tym wyrażeniu na prawo od LATERAL
sprzężenie jest oceniane raz dla każdego wiersza po lewej stronie - tak jak skorelowane podzapytanie - podczas gdy zwykłe podzapytanie (wyrażenie tabeli) jest oceniane raz tylko. (Planer zapytań ma jednak sposoby na optymalizację wydajności dla obu.)
Powiązana odpowiedź z przykładami kodu dla obu stron, rozwiązując ten sam problem:
- Zoptymalizuj zapytanie GROUP BY, aby pobrać ostatni wiersz na użytkownika
Za zwrócenie więcej niż jednej kolumny , LATERAL
join jest zazwyczaj prostsze, czystsze i szybsze.
Pamiętaj też, że odpowiednikiem skorelowanego podzapytania jest LEFT JOIN LATERAL ... ON true
:
- Wywołaj wielokrotnie funkcję zwracającą zestaw z argumentem tablicowym
Rzeczy, których podzapytanie nie może zrobić
Są są rzeczy, które LATERAL
join może zrobić, ale (skorelowane) podzapytanie nie może (łatwo). Skorelowane podzapytanie może zwrócić tylko pojedynczą wartość, a nie wiele kolumn i nie wiele wierszy — z wyjątkiem wywołań samej funkcji (które mnożą wiersze wyników, jeśli zwracają wiele wierszy). Ale nawet niektóre funkcje zwracające zestaw są dozwolone tylko w FROM
klauzula. Jak unnest()
z wieloma parametrami w Postgresie 9.4 lub nowszym. Instrukcja:
Jest to dozwolone tylko w FROM
klauzula;
To działa, ale nie można (ł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
klauzula jest krótką notacją dla CROSS JOIN
.LATERAL
jest przyjmowana automatycznie dla funkcji tabel.
Informacje o szczególnym przypadku UNNEST( array_expression [, ... ] )
:
- Jak zadeklarować funkcję zwracającą zestaw jako dozwoloną tylko w klauzuli FROM?
Ustaw funkcje zwracania w SELECT
lista
Możesz także użyć funkcji zwracających zestaw, takich jak unnest()
w SELECT
lista bezpośrednio. Kiedyś wykazywało to zaskakujące zachowanie z więcej niż jedną taką funkcją w tym samym SELECT
lista do Postgres 9.6. Ale w końcu został oczyszczony za pomocą Postgres 10 i jest teraz prawidłową alternatywą (nawet jeśli nie jest standardowym SQL). Zobacz:
- Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?
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 na stronie 10 tutaj
Wyjaśnij nieprawdziwe informacje
Instrukcja:
Dla INNER
i OUTER
typów złączenia, musi być określony warunek złączenia, dokładnie jeden z NATURAL
, ON
warunek_połączenia lub USING
(join_column [,...]). Zobacz poniżej znaczenie.
Dla CROSS JOIN
, żadna z tych klauzul nie może się pojawić.
Tak 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 Andomara jest poprawny (CROSS JOIN
nie wymaga warunku dołączenia), a jest nie było.