Solución:
Como escribió Henrik, puede usar dblink para conectar la base de datos remota y obtener el resultado. Por ejemplo:
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 tiene un pseudo-tipo de registro (solo para el argumento de la función o el tipo de resultado), lo que le permite consultar datos de otra tabla (desconocida).
Editar:
Puede hacerlo como declaración preparada si lo desea y también 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 (sí, otro):
Acabo de ver su pregunta revisada (cerrada como duplicada, o simplemente muy similar a esta).
Si mi entendimiento es correcto (postgres tiene tbla y dbtest tiene tblb y quieres inserción remota con selección local, no selección remota con inserción local como anteriormente):
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;'
);
No me gusta ese dblink anidado, pero AFAIK, no puedo hacer referencia a tblB en el cuerpo de dblink_exec. Use LIMIT para especificar las 20 filas principales, pero creo que primero debe ordenarlas usando la cláusula ORDER BY.
Si desea insertar en la columna especificada:
INSERT INTO table (time)
(SELECT time FROM
dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer)
WHERE time > 1000
);
Puede utilizar dblink para crear una vista que se resuelve en otra base de datos. Esta base de datos puede estar en otro servidor.