PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

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


Como Henrik escreveu, você pode usar o dblink para conectar o banco de dados remoto e obter o resultado. Por exemplo:
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)

O PostgreSQL possui pseudo-tipo de registro (somente para o argumento da função ou tipo de resultado), que permite consultar dados de outra tabela (desconhecida).

Editar:

Você pode fazê-lo como uma declaração preparada, se quiser, e também funciona:
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;

Editar (sim, outro):

Acabei de ver sua pergunta revisada (fechada como duplicata ou apenas muito semelhante a esta).

Se meu entendimento estiver correto (postgres tem tbla e dbtest tem tblb e você quer inserção remota com seleção local , não seleção remota com inserção local como acima):
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;'
);

Eu não gosto desse dblink aninhado, mas AFAIK não posso referenciar tblB no corpo dblink_exec. Use LIMIT para especificar as 20 principais linhas, mas acho que você precisa classificá-las usando a cláusula ORDER BY primeiro.