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

Indsæt flere rækker i en tabel baseret på antallet i en anden tabel

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



  1. Postgresql UUID understøttet af Hibernate?

  2. hvordan man skriver tal til ord funktion i sql server

  3. Forespørgselsydelsesoptimering i MySQL

  4. SQL UNION-klausul for begyndere