PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaka jest różnica między LATERAL JOIN a podzapytanie w PostgreSQL?

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ć

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak stworzyć rozszerzenie postgres wewnątrz kontenera?

  2. Ograniczenie zdefiniowane ODROCZONY POCZĄTKOWO NATYCHMIAST jest nadal ODROCZONY?

  3. Dlaczego nie mogę używać aliasów kolumn w następnym wyrażeniu SELECT?

  4. Jak zabezpieczyć bazę danych PostgreSQL — 10 wskazówek

  5. Zoptymalizuj zapytanie GROUP BY, aby pobrać ostatni wiersz na użytkownika