Risposta alla domanda originale
Postgres consente alle funzioni di restituzione dei set (SRF) di moltiplicare le righe. generate_series() è tuo amico:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
Dall'introduzione di LATERAL in Postgres 9.3 puoi attenerti all'SQL standard:l'SRF si sposta da SELECT al FROM elenco:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL è implicito qui, come spiegato nel manuale:
LATERAL può anche precedere una chiamata di funzione FROM item, ma in questo caso è una parola non significativa, perché l'espressione della funzione può comunque fare riferimento a elementi FROM precedenti.
Funzionamento inverso
Quanto sopra è l'operazione inversa (approssimativamente) di un semplice aggregato count() :
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
... che si adatta alla tua domanda aggiornata.
Nota una sottile differenza tra count(*) e count(all_names) . Il primo conta tutte le righe, qualunque cosa accada, mentre il secondo conta solo le righe in cui all_names IS NOT NULL . Se la tua colonna all_names è definito come NOT NULL , entrambi restituiscono lo stesso, ma count(*) è un po' più breve e veloce.
Informazioni su GROUP BY 1 :
- Dichiarazione GROUP BY + CASE