Postgres 10 lub nowszy
dodaje wartości null dla mniejszych zestawów. Demo z generate_series()
:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 null | 13 | 23 null | null | 24
tutaj dbfiddle
Instrukcja dla Postgresa 10 :
Jeśli na liście wyboru zapytania znajduje się więcej niż jedna funkcja zwracająca zestaw, zachowanie jest podobne do tego, co uzyskuje się umieszczając te funkcje w pojedynczym LATERAL ROWS FROM( ... )
FROM
-punkt klauzuli. Dla każdego wiersza z bazowego zapytania istnieje wiersz wyjściowy używający pierwszego wyniku z każdej funkcji, następnie wiersz wyjściowy używający drugiego wyniku i tak dalej. Jeśli niektóre funkcje zwracające zestaw dają mniej wyników niż inne, brakujące dane są zastępowane wartościami null, dzięki czemu całkowita liczba wierszy wyemitowanych dla jednego podstawowego wiersza jest taka sama, jak w przypadku funkcji zwracającej zestaw, która wygenerowała najwięcej wyników. W ten sposób funkcje zwracające zestaw działają „w lockstep”, aż wszystkie zostaną wyczerpane, a następnie wykonanie jest kontynuowane z następnym wierszem bazowym.
To kończy tradycyjnie dziwne zachowanie.
Postgres 9.6 lub starszy
Liczba wierszy wyników (co nieco zaskakujące!) to najniższa wspólna wielokrotność wszystkich zestawów w tym samym SELECT
lista. (Działa tylko jak CROSS JOIN
jeśli nie ma wspólnego dzielnika dla wszystkich rozmiarów!) Demo:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 1 | 13 | 23 2 | 11 | 24 1 | 12 | 21 2 | 13 | 22 1 | 11 | 23 2 | 12 | 24 1 | 13 | 21 2 | 11 | 22 1 | 12 | 23 2 | 13 | 24
tutaj dbfiddle
Udokumentowane w instrukcji dla Postgresa 9.6 rozdział Funkcje SQL zwracające zestawy , wraz z zaleceniem, aby tego unikać:
Uwaga:kluczowy problem związany z używaniem funkcji zwracania zestawu na liście wyboru zamiast FROM
jest to, że umieszczenie więcej niż jednego zestawu funkcji zwracających na tej samej liście wyboru nie zachowuje się zbyt rozsądnie. (To, co faktycznie otrzymasz, jeśli to zrobisz, to liczba wierszy wyjściowych równa najmniejszej wspólnej wielokrotności liczby wierszy wytwarzanych przez każdą funkcję zwracającą zestaw. ) LATERAL
składnia daje mniej zaskakujące wyniki podczas wywoływania wielu funkcji zwracających zestawy i zwykle powinna być używana zamiast tego.
Pogrubiony nacisk na moje.
Pojedyncza funkcja zwracania zestawu jest OK (ale nadal czystsza w FROM
lista), ale wiele w tym samym SELECT
lista jest teraz odradzana. To była przydatna funkcja, zanim mieliśmy LATERAL
łączy. Teraz to tylko historyczny balast.
Powiązane:
- Równoległe unnest() i porządek sortowania w PostgreSQL
- Rozgrupuj wiele tablic równolegle
- Jaka jest różnica między ŁĄCZENIEM BOCZNYM a podzapytanie w PostgreSQL?