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

Dlaczego PostgreSQL niewłaściwie łączy serie?

To dziwactwo, jak wiele funkcji zwracających zestaw jest wykonywanych po wywołaniu w SELECT -lista. Spodziewasz się, że wynik będzie iloczynem krzyżowym tych dwóch, ale tak to nie działa. W rzeczywistości jest to najniższa wspólna wielokrotność liczby wierszy z tych dwóch.

Zobacz:

Porównaj:

test=>     SELECT generate_series(1,3) aval, generate_series(1,4) bval;
 aval | bval 
------+------
    1 |    1
    2 |    2
    3 |    3
    1 |    4
    2 |    1
    3 |    2
    1 |    3
    2 |    4
    3 |    1
    1 |    2
    2 |    3
    3 |    4
(12 rows)

test=>     SELECT generate_series(1,3) aval, generate_series(1,3) bval;
 aval | bval 
------+------
    1 |    1
    2 |    2
    3 |    3
(3 rows)

Z tego powodu w PostgreSQL 9.2 i nowszych powinieneś używać LATERAL zapytania, w których wywołujesz funkcje zwracające zestaw w FROM klauzula:

test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,3) bval;
 aval | bval 
------+------
    1 |    1
    1 |    2
    1 |    3
    2 |    1
    2 |    2
    2 |    3
    3 |    1
    3 |    2
    3 |    3
(9 rows)

test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,4) bval;
 aval | bval 
------+------
    1 |    1
    1 |    2
    1 |    3
    1 |    4
    2 |    1
    2 |    2
    2 |    3
    2 |    4
    3 |    1
    3 |    2
    3 |    3
    3 |    4
(12 rows)

W starszych wersjach możesz użyć podzapytania-w-FROM, aby uniknąć wielu SRF w SELECT:

test=> SELECT generate_series(1,3) aval, bval FROM (SELECT generate_series(1,4)) AS x(bval);
 aval | bval 
------+------
    1 |    1
    2 |    1
    3 |    1
    1 |    2
    2 |    2
    3 |    2
    1 |    3
    2 |    3
    3 |    3
    1 |    4
    2 |    4
    3 |    4
(12 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BŁĄD:zduplikowana wartość klucza narusza ograniczenie unikalności w postgreSQL

  2. Wdrażanie Django + Python 3 + PostgreSQL do AWS Elastic Beanstalk

  3. pg_config pokazuje 9.4 zamiast 9.3

  4. wyszukaj duplikaty z różnych pól w postgresql

  5. Laravel:Błąd [PDOException]:Nie można znaleźć sterownika w PostgreSQL