sql >> Databáze >  >> RDS >> PostgreSQL

Proč PostgreSQL kombinuje série špatným způsobem?

Je to zvláštní způsob, jak se při vyvolání v SELECT provádí více funkcí vracejících sadu -seznam. Očekáváte, že výsledek bude křížový produkt těchto dvou, ale tak to nefunguje. Je to vlastně nejnižší společný násobek počtu řádků těchto dvou.

Viz:

Porovnejte:

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 tohoto důvodu byste na PostgreSQL 9.2 a vyšších měli používat LATERAL dotazy, kde vyvoláte funkce vracející sadu v FROM klauzule:

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)

Na starších verzích můžete použít poddotaz-in-FROM, abyste se vyhnuli více SRF ve SELECT termínu:

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. Jak předat nový PK uloženému proc v Oracle Apex

  2. Návrh databáze:jaký má smysl identifikace cizích klíčů?

  3. mysql - VLOŽTE rozsah dat do sloupců dat, POKUD se data nepřekrývají s existujícími

  4. Postgresql - jak získat záznamy v tabulce, které nemají shodu v jiné tabulce