sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?

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;
 
række2 | række 3 | række4-----+------+----- 1 | 11 | 21 2 | 12 | 22nul | 13 | 23nul | null | 24

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;
 
række2 | række 3 | række4-----+------+----- 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

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?


  1. Sådan genereres et tilfældigt heltal inden for et område i MariaDB

  2. Sådan slutter du dig til første række

  3. Installation af Oracle 9i Developer Suite 2.0 på Windows

  4. Vinduesstyring i Oracle D2k-formularer