Svar på det oprindelige spørgsmål
Postgres tillader sæt-retur-funktioner (SRF) til at multiplicere rækker. generate_series()
er din ven:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
Siden introduktionen af LATERAL
i Postgres 9.3 Du kan godt holde dig til standard SQL:SRF flytter fra SELECT
til FROM
liste:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL
er implicit her, som forklaret i manualen:
LATERAL
kan også gå forud for et funktionskald FROM
element, men i dette tilfælde er det et støjord, fordi funktionsudtrykket under alle omstændigheder kan henvise til tidligere FRA elementer.
Omvendt funktion
Ovenstående er den omvendte operation (ca.) af en simpel aggregeret count()
:
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
... som passer til dit opdaterede spørgsmål.
Bemærk en subtil forskel mellem count(*)
og count(all_names)
. Førstnævnte tæller alle rækker, uanset hvad, mens sidstnævnte kun tæller rækker, hvor all_names IS NOT NULL
. Hvis din kolonne all_names
er defineret som NOT NULL
, begge returnerer det samme, men count(*)
er lidt kortere og hurtigere.
Om GROUP BY 1
:
- GROUP BY + CASE-udsagn