sql >> データベース >  >> RDS >> PostgreSQL

別のテーブルの番号に基づいて、1つのテーブルに複数の行を挿入します

    元の質問への回答

    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ステートメント



    1. MySQLクエリ監視bashスクリプトを作成する

    2. 配列をSQLServerストアドプロシージャに渡す

    3. 特定の場所の近くにある最も近い場所を効率的に見つける方法

    4. Forループを使用してOracleでカーソルからデータをフェッチする方法