PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Inserisci più righe in una tabella in base al numero in un'altra tabella

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