Come ha scritto Henrik, puoi usare dblink per connettere il database remoto e recuperare il risultato. Ad esempio:
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 ha uno pseudo-tipo di record (solo per l'argomento della funzione o il tipo di risultato), che ti consente di interrogare i dati da un'altra tabella (sconosciuta).
Modifica:
Puoi farlo come una dichiarazione preparata se lo desideri e funziona ugualmente:
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;
Modifica (sì, un altro):
Ho appena visto la tua domanda modificata (chiusa come duplicata o semplicemente molto simile a questa).
Se la mia comprensione è corretta (postgres ha tbla e dbtest ha tblb e vuoi inserimento remoto con selezione locale , non selezione remota con inserimento locale come sopra):
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;'
);
Non mi piace quel dblink annidato, ma AFAIK non posso fare riferimento a tblB nel corpo dblink_exec. Usa LIMIT per specificare le prime 20 righe, ma penso che tu debba prima ordinarle usando la clausola ORDER BY.