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

postgresql:INSERT INTO ...(SELECT * ...)

    Henrikが書いたように、dblinkを使用してリモートデータベースに接続し、結果をフェッチできます。例:

    psql dbtest
    CREATE TABLE tblB (id serial, time integer);
    INSERT INTO tblB (time) VALUES (5000), (2000);
    
    psql postgres
    CREATE TABLE tblA (id serial, time integer);
    
    INSERT INTO tblA
        SELECT id, time 
        FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
        AS t(id integer, time integer)
        WHERE time > 1000;
    
    TABLE tblA;
     id | time 
    ----+------
      1 | 5000
      2 | 2000
    (2 rows)
    

    PostgreSQLにはレコード疑似タイプ(関数の引数または結果タイプのみ)があり、別の(不明な)テーブルからデータをクエリできます。

    編集:

    必要に応じて、プリペアドステートメントとして作成できます。これも機能します:

    PREPARE migrate_data (integer) AS
    INSERT INTO tblA
        SELECT id, time
        FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
        AS t(id integer, time integer)
        WHERE time > $1;
    
    EXECUTE migrate_data(1000);
    -- DEALLOCATE migrate_data;
    

    編集(ええ、別の):

    改訂された質問を見たところです(重複として閉じられているか、これと非常によく似ています)。

    私の理解が正しければ(postgresにはtblaがあり、dbtestにはtblbがあり、ローカル選択を使用したリモート挿入が必要です。 、ローカル挿入によるリモート選択ではありません 上記のように):

    psql dbtest
    
    SELECT dblink_exec
    (
        'dbname=postgres',
        'INSERT INTO tbla
            SELECT id, time
            FROM dblink
            (
                ''dbname=dbtest'',
                ''SELECT id, time FROM tblb''
            )
            AS t(id integer, time integer)
            WHERE time > 1000;'
    );
    

    ネストされたdblinkは好きではありませんが、dblink_exec本体でtblBを参照することはできません。 LIMITを使用して上位20行を指定しますが、最初にORDERBY句を使用してそれらを並べ替える必要があると思います。



    1. MySQLの単一引用符、二重引用符、逆引用符の使用法の説明

    2. Oracle10gの左結合で削除

    3. AzureDataStudioを使用してSQLServerデータベースを作成する

    4. Postgresql:各グループ/カテゴリから上位nパーセント(%)のエントリを選択するにはどうすればよいですか?