元の質問への回答
Postgresを使用すると、set-returning関数(SRF)で行を増やすことができます。 generate_series()
あなたの友達です:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
LATERAL
の導入以来 Postgres9.3で 標準SQLに固執することができます:SRFはSELECT
から移動します FROM
へ リスト:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL
マニュアルで説明されているように、ここでは暗黙的です:
LATERAL
関数呼び出しの前にFROM
を付けることもできます アイテムですが、この場合、関数式はどのような場合でも以前のFROMアイテムを参照できるため、これはノイズワードです。
逆操作
上記は、単純な集計count()
の(おおよその)逆の操作です。 :
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
...更新された質問に適合します。
count(*)
の微妙な違いに注意してください およびcount(all_names)
。前者は何があってもすべての行をカウントしますが、後者はall_names IS NOT NULL
の行のみをカウントします 。列がall_names
の場合 NOT NULL
として定義されています 、どちらも同じものを返しますが、count(*)
少し短くて速いです。
GROUP BY 1
について :
- GROUP BY+CASEステートメント