PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wstaw wiele wierszy w jednej tabeli na podstawie liczby w innej tabeli

Odpowiedź na pierwotne pytanie

Postgres pozwala funkcjom zwracania zestawu (SRF) na mnożenie wierszy. generate_series() jest twoim przyjacielem:

INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM  (SELECT names, generate_series(1, number) FROM a);

Od czasu wprowadzenia LATERAL w Postgresie 9.3 możesz trzymać się standardowego SQL:SRF przenosi się z SELECT do FROM lista:

INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM   a, generate_series(1, a.number) AS rn

LATERAL jest tutaj dorozumiana, jak wyjaśniono w instrukcji:

LATERAL może również poprzedzać wywołanie funkcji FROM element, ale w tym przypadku jest to słowo zakłócające, ponieważ wyrażenie funkcji może w każdym przypadku odnosić się do wcześniejszych elementów FROM.

Operacja odwrotna

Powyższe jest odwrotną operacją (w przybliżeniu) prostego agregatu count() :

INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM   b
GROUP  BY 1;

... co pasuje do Twojego zaktualizowanego pytania.

Zwróć uwagę na subtelną różnicę między count(*) i count(all_names) . Pierwsza liczy wszystkie wiersze, bez względu na wszystko, podczas gdy druga liczy tylko wiersze, w których all_names IS NOT NULL . Jeśli Twoja kolumna all_names jest zdefiniowany jako NOT NULL , oba zwracają to samo, ale count(*) jest nieco krótszy i szybszy.

Informacje o GROUP BY 1 :

  • Oświadczenie GROUP BY + CASE



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NULL kontra `nieskończoność` w typach zakresów PostgreSQL

  2. PostgreSQL:liczenie wierszy dla zapytania "po minucie"

  3. Aktualizacja do PostgreSQL 11 z replikacją logiczną

  4. O użyteczności wskaźników wyrażeń

  5. Jak wyświetlić indeksy utworzone dla tabeli w postgresie