Postgres 10 eller nyere
tilføjer nulværdier for mindre sæt(er). Demo med generate_series()
:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
dbfiddle her
Manualen til Postgres 10 :
Hvis der er mere end én sæt-returnerende funktion i forespørgslens valgliste, ligner adfærden, hvad du får ved at sætte funktionerne i en enkelt LATERAL ROWS FROM( ... )
FROM
-klausul punkt. For hver række fra den underliggende forespørgsel er der en outputrække, der bruger det første resultat fra hver funktion, derefter en outputrække, der bruger det andet resultat, og så videre. Hvis nogle af de sæt-returnerende funktioner producerer færre output end andre, erstattes null-værdier for de manglende data, således at det samlede antal rækker, der udsendes for en underliggende række, er det samme som for den sæt-returnerende funktion, der producerede flest output. De sæt-returnerende funktioner kører således "i låst trin", indtil de alle er udtømte, og derefter fortsætter udførelsen med den næste underliggende række.
Dette afslutter den traditionelt mærkelige adfærd.
Postgres 9.6 eller ældre
Antallet af resultatrækker (noget overraskende!) er det laveste fælles multiplum af alle sæt i den samme SELECT
liste. (Fungerer kun som en CROSS JOIN
hvis der ikke er en fælles divisor for alle sæt-størrelser!) Demo:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
dbfiddle her
Dokumenteret i manualen til Postgres 9.6 kapitlet SQL-funktioner, der returnerer sæt , sammen med anbefalingen om at undgå det:
Bemærk:Hovedproblemet med at bruge sæt-retur-funktioner i valglisten i stedet for FROM
klausul, er, at det ikke opfører sig særlig fornuftigt at sætte mere end én-returnerende funktion i den samme valgliste. (Hvad du faktisk får, hvis du gør det, er et antal outputrækker, der er lig med det mindste fælles multiplum af antallet af rækker, der produceres af hver sæt-returnerende funktion. ) LATERAL
syntaks giver ikke overraskende resultater, når der kaldes flere sæt-returnerende funktioner, og bør normalt bruges i stedet.
Fed fremhævelse mine.
En enkelt sæt-returnerende funktion er OK (men stadig renere i FROM
). liste), men flere i samme SELECT
listen frarådes nu. Dette var en nyttig funktion, før vi havde LATERAL
slutter sig til. Nu er det kun historisk ballast.
Relateret:
- Parallel unnest() og sorteringsrækkefølge i PostgreSQL
- Unnest flere arrays parallelt
- Hvad er forskellen mellem LATERAL JOIN og en underforespørgsel i PostgreSQL?