Odpověď na původní otázku
Postgres umožňuje funkcím vracejícím sadu (SRF) násobit řádky. generate_series()
je tvůj přítel:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
Od zavedení LATERAL
v Postgres 9.3 můžete se držet standardního SQL:SRF se přesune z SELECT
do FROM
seznam:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL
je zde implicitní, jak je vysvětleno v návodu:
LATERAL
může také předcházet volání funkceFROM
položka, ale v tomto případě je to šumové slovo, protože výraz funkce může v každém případě odkazovat na dřívější položky FROM.
Obrácený provoz
Výše uvedené je obrácená operace (přibližně) jednoduchého agregovaného count()
:
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
... která odpovídá vaší aktualizované otázce.
Všimněte si jemného rozdílu mezi count(*)
a count(all_names)
. První počítá všechny řádky, bez ohledu na to, co, zatímco druhý počítá pouze řádky, kde all_names IS NOT NULL
. Pokud váš sloupec all_names
je definován jako NOT NULL
, oba vrátí totéž, ale count(*)
je o něco kratší a rychlejší.
O GROUP BY 1
:
- Příkaz GROUP BY + CASE