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