PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgresql :INSÉRER DANS ... (SELECT * ...)

Comme Henrik l'a écrit, vous pouvez utiliser dblink pour connecter une base de données distante et récupérer le résultat. Par exemple :

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 a un pseudo-type d'enregistrement (uniquement pour l'argument ou le type de résultat de la fonction), qui vous permet d'interroger les données d'une autre table (inconnue).

Modifier :

Vous pouvez en faire une déclaration préparée si vous le souhaitez et cela fonctionne également :

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;

Edit (ouais, un autre):

Je viens de voir votre question révisée (fermée en double, ou tout simplement très similaire à celle-ci).

Si ma compréhension est correcte (postgres a tbla et dbtest a tblb et vous voulez insertion à distance avec sélection locale , et non sélection à distance avec insertion locale comme ci-dessus):

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;'
);

Je n'aime pas ce dblink imbriqué, mais autant que je sache, je ne peux pas faire référence à tblB dans le corps dblink_exec. Utilisez LIMIT pour spécifier les 20 premières lignes, mais je pense que vous devez d'abord les trier à l'aide de la clause ORDER BY.