sql >> Databáze >  >> RDS >> PostgreSQL

Vložte více řádků do jedné tabulky na základě čísla v jiné tabulce

Odpověď na původní otázku

Postgres umožňuje funkcím vracejícím sadu (SRF) násobit řádky. generate_series() je tvůj přítel:

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

Od zavedení LATERAL v Postgres 9.3 můžete se držet standardního SQL:SRF se přesune z SELECT do FROM seznam:

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

LATERAL je zde implicitní, jak je vysvětleno v návodu:

LATERAL může také předcházet volání funkce FROM položka, ale v tomto případě je to šumové slovo, protože výraz funkce může v každém případě odkazovat na dřívější položky FROM.

Obrácený provoz

Výše uvedené je obrácená operace (přibližně) jednoduchého agregovaného count() :

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

... která odpovídá vaší aktualizované otázce.

Všimněte si jemného rozdílu mezi count(*) a count(all_names) . První počítá všechny řádky, bez ohledu na to, co, zatímco druhý počítá pouze řádky, kde all_names IS NOT NULL . Pokud váš sloupec all_names je definován jako NOT NULL , oba vrátí totéž, ale count(*) je o něco kratší a rychlejší.

O GROUP BY 1 :

  • Příkaz GROUP BY + CASE



  1. Jaký je nejlepší způsob migrace Django DB z SQLite do MySQL?

  2. Jak zobrazit obrázek z databáze pomocí php

  3. Jak uložit obrázek do sloupce databázových tabulek SQL Server

  4. Jak se připojit k MySQL na Amazon EC2 z Windows?