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

Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migracja z DB2 do PostgreSQL — co powinieneś wiedzieć

  2. PostgreSQL konwertuje kolumny na wiersze? Transponować?

  3. Użyj binarnej tabeli COPY FROM z psycopg2

  4. Jak w PostgreSQL wstawić dane za pomocą polecenia COPY?

  5. W jaki sposób Postgresql COPY TO STDIN with CSV wykonuje aktualizację w przypadku konfliktu?