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:
LATERALmůže také předcházet volání funkceFROMpolož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